<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="utf-8" />
   
  <meta name="keywords" content="Java Python" />
   
  <meta name="description" content="From Zero to Hero" />
  
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1" />
  <title>
    Linux-00-实战学习 |  朱酱酱的学习博客
  </title>
  <meta name="generator" content="hexo-theme-yilia-plus">
  
  <link rel="shortcut icon" href="/favicon.ico" />
  
  
<link rel="stylesheet" href="/css/style.css">

  
<script src="/js/pace.min.js"></script>


  

  

<link rel="alternate" href="/atom.xml" title="朱酱酱的学习博客" type="application/atom+xml">
</head>

</html>

<body>
  <div id="app">
    <main class="content">
      <section class="outer">
  <article id="post-Linux/Linux-00-实战学习" class="article article-type-post" itemscope
  itemprop="blogPost" data-scroll-reveal>

  <div class="article-inner">
    
    <header class="article-header">
       
<h1 class="article-title sea-center" style="border-left:0" itemprop="name">
  Linux-00-实战学习
</h1>
  

    </header>
    

    
    <div class="article-meta">
      <a href="/2020/08/18/Linux/Linux-00-%E5%AE%9E%E6%88%98%E5%AD%A6%E4%B9%A0/" class="article-date">
  <time datetime="2020-08-18T07:52:53.000Z" itemprop="datePublished">2020-08-18</time>
</a>
      
      
      
<div class="word_count">
    <span class="post-time">
        <span class="post-meta-item-icon">
            <i class="ri-quill-pen-line"></i>
            <span class="post-meta-item-text"> 字数统计:</span>
            <span class="post-count">33.9k字</span>
        </span>
    </span>

    <span class="post-time">
        &nbsp; | &nbsp;
        <span class="post-meta-item-icon">
            <i class="ri-book-open-line"></i>
            <span class="post-meta-item-text"> 阅读时长≈</span>
            <span class="post-count">138分钟</span>
        </span>
    </span>
</div>

      
    </div>
    

    
    
    <div class="tocbot"></div>





    

    <div class="article-entry" itemprop="articleBody">
      


      

      
      <h1 id="Linux-00-实战学习"><a href="#Linux-00-实战学习" class="headerlink" title="Linux-00-实战学习"></a>Linux-00-实战学习</h1><p><strong>Linux 命令大全 ：</strong> <a href="https://www.runoob.com/linux/linux-command-manual.html" target="_blank" rel="noopener">https://www.runoob.com/linux/linux-command-manual.html</a></p>
<a id="more"></a>



<h2 id="1-常用命令部分"><a href="#1-常用命令部分" class="headerlink" title="1. 常用命令部分"></a>1. 常用命令部分</h2><h3 id="1-1-文件查看"><a href="#1-1-文件查看" class="headerlink" title="1.1 文件查看"></a>1.1 文件查看</h3><h4 id="1-ls-命令"><a href="#1-ls-命令" class="headerlink" title="1. ls 命令"></a>1. ls 命令</h4><p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201203/143549144.png" alt="mark"></p>
<p><strong>注意</strong></p>
<ol>
<li><strong>隐藏文件</strong>是以`开头</li>
<li>第一列权限符代表的是<strong>文件的类型</strong> <ul>
<li>例如 d 代表的是文件夹</li>
<li>例如 - 代表的就是普通文件</li>
</ul>
</li>
<li><code>ls -R</code> 会递归显示<strong>当前所有文件夹下面的文件</strong></li>
</ol>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201203/143724964.png" alt="mark"></p>
<h4 id="2-cd-命令"><a href="#2-cd-命令" class="headerlink" title="2. cd 命令"></a>2. cd 命令</h4><p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201203/144424561.png" alt="mark"></p>
<p><strong>注意 ：</strong></p>
<ol>
<li><strong>执行<code>man cd</code>不会显示cd 的工作帮助，会显示bash 的帮助</strong><ul>
<li><strong>cd 是 bash 的内置命令</strong></li>
<li>获取内置命令帮助 需要 <code>help cd</code></li>
</ul>
</li>
</ol>
<img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201203/144616070.png" alt="mark" style="zoom:50%;" />

<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201203/144714560.png" alt="mark"></p>
<ol start="2">
<li><strong>小技巧</strong> <ol>
<li><strong><code>cd -</code> 会回到上一次所在的目录</strong></li>
<li><strong><code>cd ../</code> 返回当前目录的上一级目录</strong></li>
<li><strong><code>cd ..</code> 返回当前目录的上一级目录</strong></li>
<li><strong><code>cd ./下一级目录名</code> ：进入下一级目录</strong></li>
</ol>
</li>
</ol>
<h3 id="1-2-文件操作"><a href="#1-2-文件操作" class="headerlink" title="1.2 文件操作"></a>1.2 文件操作</h3><h4 id="1-mkdir-命令"><a href="#1-mkdir-命令" class="headerlink" title="1. mkdir 命令"></a>1. mkdir 命令</h4><ol>
<li><code>mkdir -p /a/b/c/d</code> <ul>
<li><strong>在 根目录下 创建 多级目录</strong> <code>/a/b/c/d</code></li>
</ul>
</li>
</ol>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201206/162934198.png" alt="mark"></p>
<h4 id="2-rm-命令"><a href="#2-rm-命令" class="headerlink" title="2. rm 命令"></a>2. rm 命令</h4><ol>
<li><strong>删除空目录 – <code>rmdir</code></strong></li>
<li><strong>删除非空目录 – <code>rm -r</code></strong></li>
</ol>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201206/162959806.png" alt="mark"></p>
<p><strong>注意 ：</strong> </p>
<ol>
<li><code>rm -rf</code> 不会显示提示 删除对应文件夹下的所有非空文件和目录</li>
<li><code>rm -r</code> 会有提示的删除对应文件下所有非空的文件和目录</li>
</ol>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201206/164940841.png" alt="mark"></p>
<h4 id="3-cp-命令"><a href="#3-cp-命令" class="headerlink" title="3. cp 命令"></a>3. cp 命令</h4><ul>
<li>复制文件（<code>copy</code>）</li>
</ul>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201206/164316373.png" alt="mark"></p>
<p><strong>注意</strong></p>
<ol>
<li><strong>cp 是用来普通复制文件的，如果想要复制目录 需要加上参数 <code>cp -r</code></strong></li>
<li><strong><code>cp -p</code> 会保留复制文件的属性参数（时间 权限。。。。）</strong></li>
</ol>
<h4 id="4-mv-命令"><a href="#4-mv-命令" class="headerlink" title="4. mv 命令"></a>4. mv 命令</h4><ol>
<li><strong>重命名</strong> 文件  : <code>mv filename1 filename2</code></li>
<li><strong>移动文件</strong> ： <code>mv sourcepath/sourfile destpath</code></li>
<li><strong>移动并且重命名文件</strong> ： <code>mv sourcepath/sourfile destpath/destfile</code></li>
</ol>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201206/164832305.png" alt="mark"></p>
<h4 id="5-通配符"><a href="#5-通配符" class="headerlink" title="5. 通配符"></a>5. 通配符</h4><ol>
<li><strong><code>*</code> 匹配多个字符</strong></li>
<li><strong><code>?</code> 匹配单个字符</strong></li>
<li><strong>以上两个符号可以和命令结合使用</strong></li>
</ol>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201206/165112459.png" alt="mark"></p>
<h3 id="1-3-文本查看"><a href="#1-3-文本查看" class="headerlink" title="1.3 文本查看"></a>1.3 文本查看</h3><p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201206/165303155.png" alt="mark"></p>
<h4 id="1-cat"><a href="#1-cat" class="headerlink" title="1. cat"></a>1. cat</h4><h4 id="2-head"><a href="#2-head" class="headerlink" title="2. head"></a>2. head</h4><ul>
<li><strong>默认查看前十行的信息</strong></li>
</ul>
<h4 id="3-tail"><a href="#3-tail" class="headerlink" title="3. tail"></a>3. tail</h4><ul>
<li><p><strong>默认查看后十行的信息</strong></p>
</li>
<li><p><strong><code>tail -f</code> 同步进行更新尾部的信息 （适用于tomcat日志文件）</strong></p>
</li>
</ul>
<h4 id="4-wc"><a href="#4-wc" class="headerlink" title="4. wc"></a>4. wc</h4><ul>
<li><strong><code>wc -l</code> 查看文件有多少行 再决定是否用<code>cat</code>选项</strong> </li>
</ul>
<h4 id="5-more"><a href="#5-more" class="headerlink" title="5 more"></a>5 more</h4><ul>
<li>分页显示前面内容</li>
<li>使用空格继续显示后续内容</li>
</ul>
<h4 id="6-less"><a href="#6-less" class="headerlink" title="6. less"></a>6. less</h4><ul>
<li>less 与 more 类似，但使用 less 可以随意浏览文件，而 more 仅能向前移动，却不能向后移动，而且 less 在查看之前不会加载整个文件。</li>
</ul>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">less [参数] 文件</span><br></pre></td></tr></table></figure>



<h3 id="1-4-文件打包和压缩"><a href="#1-4-文件打包和压缩" class="headerlink" title="1.4 文件打包和压缩"></a>1.4 文件打包和压缩</h3><h4 id="1-打包和压缩"><a href="#1-打包和压缩" class="headerlink" title="1. 打包和压缩"></a>1. 打包和压缩</h4><p><strong>注意：</strong></p>
<ol>
<li><strong>打包和压缩对于Linux来说 是分开的步骤</strong></li>
</ol>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201206/170113392.png" alt="mark"></p>
<p><strong>例如 ：</strong> <code>tar cf /tmp/etc-backup.tar /etc</code> </p>
<ul>
<li>c 打包命令</li>
<li>f 打包成文件</li>
<li><code>/tmp/etc-backup.tar</code> /打包到哪里去/打包的文件名叫什么 </li>
<li><code>/etc</code> 对哪个目录进行打包</li>
</ul>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201207/150706411.png" alt="mark"></p>
<p><strong>例如 ：</strong> <code>tar czf /tmp/etc-backup.tar /etc</code> </p>
<ul>
<li>c 打包命令</li>
<li>f 打包成文件</li>
<li>打包选项<ul>
<li><code>j</code> 是使用bz2 进行压缩  <code>tar cjf /tmp/etc-backup.tar.bz2 /etc</code></li>
<li><code>z</code> 是使用gzip 进行压缩 <code>tar czf /tmp/etc-backup.tar.gz /etc</code></li>
</ul>
</li>
<li><code>/tmp/etc-backup.tar</code> /打包到哪里去/打包的文件名叫什么 </li>
<li><code>/etc</code> 对哪个目录进行打包</li>
</ul>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201207/151234915.png" alt="mark"></p>
<p><strong>注意 ：</strong></p>
<ul>
<li><strong>bz2 压缩的时间会比 gzip 的时间长</strong></li>
<li><strong>bz2 压缩的文件大小会比gzip 的文件小</strong></li>
</ul>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201207/151512233.png" alt="mark"></p>
<h4 id="2-解压缩"><a href="#2-解压缩" class="headerlink" title="2. 解压缩"></a>2. <strong>解压缩</strong></h4><p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201207/151603474.png" alt="mark"></p>
<p>例如 ： <code>tar xf /tmp/etc-backup.tar -C /root</code></p>
<ul>
<li>x 解包</li>
<li>f 解包为文件</li>
<li><code>/tmp/etc-backup.tar</code> 对谁进行解包</li>
<li><code>-C</code> 放在什么位置需要加上</li>
<li><code>/root</code> 解压完放在哪个目录下 </li>
<li><strong>解包选项</strong><ul>
<li><code>j</code> 是使用bz2 进行压缩  <code>tar xjf /tmp/etc-backup.tar.bz2 /root</code></li>
<li><code>z</code> 是使用gzip 进行压缩 <code>tar xzf /tmp/etc-backup.tar.gz /root</code></li>
</ul>
</li>
</ul>
<p><strong>注意 ：双扩展名缩写</strong></p>
<ul>
<li><code>.tar.bz2 = .tbz2</code></li>
<li><code>.tar.gz = .tgz</code></li>
</ul>
<h2 id="2-文本编辑器-vi"><a href="#2-文本编辑器-vi" class="headerlink" title="2. 文本编辑器 vi"></a>2. 文本编辑器 vi</h2><ol>
<li><strong>输入 <code>vim 或 vi</code></strong> </li>
</ol>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201207/153225839.png" alt="mark"></p>
<ol start="2">
<li><strong><code>vim</code> 的四种工作模式</strong></li>
</ol>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201207/153045707.png" alt="mark"></p>
<ul>
<li>Vim是从 vi 发展出来的一个文本编辑器。代码补完、编译及错误跳转等方便编程的功能特别丰富，在程序员中被广泛使用。</li>
<li>简单的来说， vi 是老式的字处理器，不过功能已经很齐全了，但是还是有可以进步的地方。 vim 则可以说是程序开发者的一项很好用的工具。</li>
<li><strong>vim 官网</strong> ： <a href="https://www.vim.org/" target="_blank" rel="noopener">https://www.vim.org/</a></li>
<li><strong>菜鸟教程</strong> ： <a href="https://www.runoob.com/linux/linux-vim.html" target="_blank" rel="noopener">https://www.runoob.com/linux/linux-vim.html</a></li>
</ul>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201209/093943425.png" alt="mark"></p>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201211/110707643.png" alt="mark"></p>
<h3 id="2-1-vim-正常模式"><a href="#2-1-vim-正常模式" class="headerlink" title="2.1 vim 正常模式"></a>2.1 vim 正常模式</h3><ol>
<li><strong>插入模式</strong><ul>
<li><code>i</code> 进入插入模式</li>
<li><code>I</code> 进入插入模式 ： 光标来到本行的开头</li>
<li><code>a</code> 进入插入模式：  光标来到插入位置的后一位</li>
<li><code>A进入插入模式</code>：      光标来到本行的末尾</li>
<li><code>o</code> 进入插入模式 ： 光标来到当前的下一行，并在下方产生一个新的空行</li>
<li><code>O</code> 进入插入模式 ： 光标来到当前的上一行，并在上方产生一个新的空行</li>
</ul>
</li>
</ol>
<ol start="3">
<li><strong>复制剪切粘贴</strong><ul>
<li><code>yy</code> : 进行整行的复制<ul>
<li><code>3yy</code> 连续复制三行数据</li>
</ul>
</li>
<li><code>y$</code> ： 复制从光标的位置到本行结尾的数据</li>
<li><code>p</code> ： 进行整行的粘贴</li>
<li><code>dd</code> :  剪切一整行</li>
<li><code>d$</code> :  剪切从光标到本行结尾</li>
</ul>
</li>
</ol>
<ol start="4">
<li><strong>撤销和回撤</strong><ul>
<li><code>u</code> ： 普通模式下按u进行撤销/ 多次u多次撤销</li>
<li><code>ctrl + R</code> : 撤销指令进行回撤（重新执行）</li>
</ul>
</li>
</ol>
<ol start="5">
<li><strong>单个字符删除 / 替换</strong><ul>
<li><code>x</code> : 删除光标指定的字符</li>
<li><code>r</code> : 替换光标指定的字符</li>
</ul>
</li>
</ol>
<ol start="6">
<li><p><strong>移动光标</strong></p>
<ul>
<li><p><code>g</code> : 直接来到第一行第一个字符</p>
</li>
<li><p><code>G</code> : 直接来到最后一行第一个字符</p>
</li>
<li><p><code>数字 + G</code> : 直接移动到对应数字指定的行</p>
</li>
<li><p><code>h</code> : 光标向左移动</p>
</li>
<li><p><code>j</code> : 光标向下移动</p>
</li>
<li><p><code>k</code> : 光标向上移动</p>
</li>
<li><p><code>l</code> : 光标向右移动</p>
</li>
<li><p><code>shift + 6 = ^</code> : 来到这一行的开头</p>
</li>
<li><p><code>shift + 4 = $</code>  来到这一行的结尾</p>
</li>
<li><p><code>数字 + 空格</code> ： 光标移动到数字个字符后的位置</p>
</li>
<li><p><code>数字 + 回车</code> :    光标移动到n行以后的位置</p>
</li>
</ul>
</li>
</ol>
<h3 id="2-2-vim-命令行模式"><a href="#2-2-vim-命令行模式" class="headerlink" title="2.2 vim 命令行模式"></a>2.2 vim 命令行模式</h3><ol>
<li><strong>保存 / 退出</strong><ul>
<li><code>:</code>  :   光标来到最后一行</li>
<li><code>:w /root/a.txt</code> ： 保存 到 root 下面 ，文件名 a.txt</li>
<li><code>:q</code> :    退出</li>
<li><code>:wq</code>  ： 保存并且退出</li>
<li><code>:q!</code> : 不保存并且退出</li>
</ul>
</li>
</ol>
<ol start="2">
<li><strong>同时执行linux命令</strong><ul>
<li><code>:! + 命令</code>  ： 在vim模式下执行linux命令</li>
</ul>
</li>
</ol>
<ol start="3">
<li><strong>查找命令/替换</strong><ul>
<li><code>/ + 要查找的内容</code><ul>
<li>查找到之后  使用    <code>n</code>    来查找下一个匹配的位置</li>
<li>查找到之后  使用    <code>N</code>    来查找上一个匹配的位置</li>
</ul>
</li>
<li><code>:s/old/new</code>  : 查找到旧的(old) 替换成新的字符(new)<ul>
<li>本操作默认只针对光标所在的这一行</li>
<li><code>:%s/old/new</code>  :      全文new替换单一个位置的old</li>
<li><code>:%s/old/new/g</code>  :  全文new 替换所有位置的old (g = global)</li>
<li><code>:3,5s/old/new/g</code>  指定行new 替换所有位置的old (g = global)</li>
</ul>
</li>
</ul>
</li>
</ol>
<ol start="4">
<li><strong>修改配置</strong><ul>
<li><code>:set nu</code>  : 显示文本的行号   （暂时配置）</li>
<li><code>:set nonu</code> : 不显示文本的行号（暂时配置）</li>
<li><code>vim /etc/vimrc</code>  : 进入配置文件进行配置 （永久配置）<ul>
<li>如 新建一行 <code>set nu</code> 永久显示行号</li>
</ul>
</li>
</ul>
</li>
</ol>
<h3 id="2-3-vim-可视模式"><a href="#2-3-vim-可视模式" class="headerlink" title="2.3 vim 可视模式"></a>2.3 vim 可视模式</h3><p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201211/110642972.png" alt="mark"></p>
<ol>
<li><code>v</code> ：字符可视模式</li>
<li><code>V</code> :    行可视模式</li>
<li><code>ctrl + v</code> ：块可视模式<ul>
<li>指定选中块 <code>I</code>添加元素</li>
<li>指定选中块 d删除元素</li>
</ul>
</li>
</ol>
<h2 id="3-用户和用户组管理"><a href="#3-用户和用户组管理" class="headerlink" title="3. 用户和用户组管理"></a>3. 用户和用户组管理</h2><p><strong>手册链接</strong> ： [用户和用户组管理][<a href="https://www.runoob.com/linux/linux-user-manage.html]" target="_blank" rel="noopener">https://www.runoob.com/linux/linux-user-manage.html]</a></p>
<ul>
<li><code>Linux</code>系统是一个多用户多任务的分时操作系统，任何一个要使用系统资源的用户，都必须首先向系统管理员申请一个账号，然后以这个账号的身份进入系统。</li>
<li>用户的账号一方面可以帮助系统管理员对使用系统的用户进行跟踪，并控制他们对系统资源的访问；另一方面也可以帮助用户组织文件，并为用户提供安全性保护。</li>
</ul>
<p>每个用户账号都拥有一个唯一的用户名和各自的口令。</p>
<p>用户在登录时键入正确的用户名和口令后，就能够进入系统和自己的主目录。</p>
<p>实现用户账号的管理，要完成的工作主要有如下几个方面：</p>
<ul>
<li>用户账号的添加、删除与修改。</li>
<li>用户口令的管理。</li>
<li>用户组的管理。</li>
</ul>
<h3 id="3-1-用户管理常用命令"><a href="#3-1-用户管理常用命令" class="headerlink" title="3.1 用户管理常用命令"></a>3.1 用户管理常用命令</h3><p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201212/163508066.png" alt="mark"></p>
<h4 id="1-useradd"><a href="#1-useradd" class="headerlink" title="1. useradd"></a>1. useradd</h4><p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201212/163825953.png" alt="mark"></p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">useradd 选项 用户名</span><br></pre></td></tr></table></figure>

<p>参数说明：</p>
<ul>
<li><p><strong>选项:</strong></p>
<ul>
<li><code>-c comment</code>指定一段注释性描述。</li>
<li><code>-d</code>目录 指定用户主目录，如果此目录不存在，则同时使用-m选项，可以创建主目录。</li>
<li><code>-g</code> 用户组 指定用户所属的用户组。</li>
<li><code>-G</code> 用户组，用户组 指定用户所属的附加组。</li>
<li><code>-s</code>Shell文件 指定用户的登录Shell。</li>
<li><code>-u</code> 用户号 指定用户的用户号，如果同时有-o选项，则可以重复使用其他用户的标识号。</li>
</ul>
</li>
<li><p><strong>用户名:</strong></p>
<p>指定新账号的登录名。</p>
</li>
</ul>
<p><strong>注意</strong></p>
<ul>
<li><strong>两者对应的目录不同</strong> <ul>
<li><code>root</code> 默认在 <code>/root</code> 下</li>
<li><code>zhuuu</code> 默认在 <code>/home/同名目录</code> 下</li>
<li>同时操作系统会记录当前用户信息到配置文件中</li>
</ul>
</li>
</ul>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201212/164100817.png" alt="mark"></p>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201212/164446733.png" alt="mark"></p>
<h4 id="2-passwd"><a href="#2-passwd" class="headerlink" title="2. passwd"></a>2. passwd</h4><ul>
<li>用户管理的一项重要内容是用户口令的管理。<strong>用户账号刚创建时没有口令，但是被系统锁定，无法使用，必须为其指定口令后才可以使用，即使是指定空口令。</strong></li>
<li>指定和修改用户口令的Shell命令是<code>passwd</code>。<strong>超级用户可以为自己和其他用户指定口令，普通用户只能用它修改自己的口令</strong>。命令的格式为：</li>
</ul>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">passwd 选项 用户名</span><br></pre></td></tr></table></figure>



<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201212/164829393.png" alt="mark"></p>
<ul>
<li>例如，假设当前用户是sam，则下面的<strong>命令修改该用户自己的口令</strong>：</li>
</ul>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">$ passwd </span><br><span class="line">Old password:****** </span><br><span class="line">New password:******* </span><br><span class="line">Re-enter new password:*******</span><br></pre></td></tr></table></figure>

<ul>
<li><strong>如果是超级用户</strong>，可以用下列形式指定任何用户的口令：</li>
</ul>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"># passwd sam </span><br><span class="line">New password:******* </span><br><span class="line">Re-enter new password:*******</span><br></pre></td></tr></table></figure>



<h4 id="3-userdel"><a href="#3-userdel" class="headerlink" title="3. userdel"></a>3. userdel</h4><ul>
<li>如果一个用户的账号不再使用，可以从系统中删除。</li>
<li><strong>删除用户账号就是要将<code>etc/passwd</code>等系统文件中的该用户记录删除，必要时还删除用户的主目录。</strong></li>
</ul>
<ol>
<li>删除一个已有的用户账号使用<code>userdel</code>命令，其格式如下：</li>
</ol>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">userdel 选项 用户名</span><br></pre></td></tr></table></figure>



<ol start="2">
<li><p><strong>常用的选项是 -r，它的作用是把用户的主目录一起删除。</strong></p>
<p>例如：</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"># userdel -r sam</span><br></pre></td></tr></table></figure>



</li>
</ol>
<ol start="3">
<li><strong>此命令删除用户sam在系统文件中（主要是/etc/passwd, /etc/shadow, /etc/group等）的记录，同时删除用户的主目录。</strong></li>
</ol>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201212/165048418.png" alt="mark"></p>
<h4 id="4-usermod"><a href="#4-usermod" class="headerlink" title="4. usermod"></a>4. usermod</h4><ul>
<li><p>修改用户账号就是根据实际情况更改用户的有关属性，如<strong>用户号、主目录、用户组、登录Shel</strong>l等。</p>
</li>
<li><p>修改已有用户的信息使用<code>usermod</code>命令，其格式如下：</p>
</li>
</ul>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">usermod 选项 用户名</span><br></pre></td></tr></table></figure>

<ul>
<li>常用的选项包括<code>-c, -d, -m, -g, -G, -s, -u以及-o等</code>，这些选项的意义与<code>useradd</code>命令中的选项一样，可以为用户指定新的资源值。</li>
</ul>
<p>例如：</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"># usermod -s &#x2F;bin&#x2F;ksh -d &#x2F;home&#x2F;z –g developer sam</span><br></pre></td></tr></table></figure>

<p>此命令将用户sam的登录Shell修改为ksh，主目录改为/home/z，用户组改为developer。</p>
<h4 id="5-chage"><a href="#5-chage" class="headerlink" title="5. chage"></a>5. chage</h4><ul>
<li>设置用户的生命周期</li>
</ul>
<h3 id="3-2-用户组管理"><a href="#3-2-用户组管理" class="headerlink" title="3.2 用户组管理"></a>3.2 用户组管理</h3><ul>
<li>每个用户都有一个用户组，系统可以对一个用户组中的所有用户进行集中管理。</li>
<li>不同<code>Linux</code> 系统对用户组的规定有所不同，如<code>Linu</code>x下的用户属于与它同名的用户组，这个用户组在创建用户时同时创建。</li>
</ul>
<h4 id="1-groupadd"><a href="#1-groupadd" class="headerlink" title="1. groupadd"></a>1. groupadd</h4><ol>
<li><strong>方式一 ： 新建用户组并且放入新用户</strong></li>
</ol>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201212/171411570.png" alt="mark"></p>
<ol start="2">
<li><p>*<em>方式二 ： 新建用户组并且放入新用户 *</em> </p>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201212/171508704.png" alt="mark"></p>
</li>
</ol>
<h4 id="2-groupdel"><a href="#2-groupdel" class="headerlink" title="2. groupdel"></a>2. groupdel</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">groupdel 用户组</span><br></pre></td></tr></table></figure>



<p>例如：</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"># groupdel group1</span><br></pre></td></tr></table></figure>

<p>此命令从系统中删除组group1。</p>
<h3 id="3-3-切换用户"><a href="#3-3-切换用户" class="headerlink" title="3.3 切换用户"></a>3.3 切换用户</h3><p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201212/172216369.png" alt="mark"></p>
<ol>
<li><code>su</code> 切换用户<ul>
<li><strong><code>su - user1</code> ： 表示工作环境同时切换为user1</strong></li>
</ul>
</li>
</ol>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201212/171743015.png" alt="mark"></p>
<p><strong>注意 ：</strong></p>
<ul>
<li><strong>普通用户</strong>之间切换需要使用密码</li>
<li><strong>root 用户</strong>切换不需要使用密码</li>
</ul>
<ol start="2">
<li><strong>授权普通用户进行关机命令</strong></li>
</ol>
<ul>
<li><p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201212/172454537.png" alt="mark"></p>
</li>
<li><p><code>root</code> 用户设置30分钟后关机</p>
</li>
<li><p><code>user</code> 用户取消30分钟后关机</p>
</li>
<li><p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201212/172608969.png" alt="mark"></p>
</li>
</ul>
<p><strong>注意 ： 在不告知user 密码的情况的下 ： 使用shutdown -c 命令</strong></p>
<ol>
<li><strong>给user 用户设置密码</strong></li>
<li><strong>使用<code>visudo</code> 命令</strong><ul>
<li>在本配置文件下，可以给用户赋予不同权限</li>
<li><code>:!which shutdown</code> 可以查找对应命令的目录在哪里</li>
<li><code>user3 ALL=/sbin/shutdown -c</code> 加入对应的权限命令</li>
</ul>
</li>
</ol>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201212/173800290.png" alt="mark"></p>
<ol start="3">
<li><strong>这时使用<code>shutdown -c</code>仍然会提示权限不够</strong><ul>
<li><strong>需要使用<code>sudo /sbin/shutdown -c</code> 并且输入用户密码才能取消</strong></li>
</ul>
</li>
</ol>
<h3 id="3-4-用户组的配置文件"><a href="#3-4-用户组的配置文件" class="headerlink" title="3.4 用户组的配置文件"></a>3.4 用户组的配置文件</h3><ul>
<li><p>完成用户管理的工作有许多种方法，但是每一种方法实际上都是对有关的系统文件进行修改。</p>
</li>
<li><p>与用户和用户组相关的信息都存放在一些系统文件中，这些文件包括<code>/etc/passwd</code>, <code>/etc/shadow</code>, <code>/etc/group</code>等。</p>
</li>
</ul>
<p>下面分别介绍这些文件的内容。</p>
<h4 id="1-etc-passwd"><a href="#1-etc-passwd" class="headerlink" title="1. /etc/passwd"></a>1. /etc/passwd</h4><ul>
<li><p><strong>/etc/passwd文件是用户管理工作涉及的最重要的一个文件。</strong></p>
</li>
<li><p>Linux系统中的每个用户都在/etc/passwd文件中有一个对应的记录行，它记录了这个用户的一些基本属性。</p>
</li>
<li><p>这个文件对所有用户都是可读的。它的内容类似下面的例子：</p>
</li>
</ul>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201213/103014232.png" alt="mark"></p>
<ul>
<li>从上面的例子我们可以看到，<code>/etc/passwd</code>中一行记录对应着一个用户，<strong>每行记录又被冒号(:)分隔为7个字段</strong>，其格式和具体含义如下：</li>
</ul>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">用户名:口令:用户标识号:组标识号:注释性描述:主目录:登录Shell</span><br></pre></td></tr></table></figure>



<ol>
<li><strong>用户名</strong></li>
</ol>
<ul>
<li><p>通常长度不超过8个字符，并且由大小写字母和/或数字组成。<strong>登录名中不能有冒号(:)，</strong>因为冒号在这里是分隔符。</p>
<p>为了兼容起见，登录名中最好不要包含点字符(.)，并且不使用连字符(-)和加号(+)打头。</p>
</li>
</ul>
<ol start="2">
<li><strong>口令</strong></li>
</ol>
<ul>
<li>虽然这个字段存放的只是用户口令的加密串，不是明文，</li>
<li><strong>但是由于/etc/passwd文件对所有用户都可读，所以这仍是一个安全隐患。</strong></li>
<li><strong>因此，现在许多Linux 系统（如SVR4）都使用了shadow技术，</strong>把真正的加密后的用户口令字存放到/etc/shadow文件中，而在/etc/passwd文件的口令字段中只存放一个特殊的字符，例如“x”或者“*”。</li>
</ul>
<ol start="3">
<li><strong>用户id</strong></li>
</ol>
<ul>
<li><p>是一个整数，系统内部用它来标识用户。</p>
</li>
<li><p>一般情况下它与用户名是一一对应的。<strong>如果几个用户名对应的用户标识号是一样的，系统内部将把它们视为同一个用户</strong></p>
</li>
<li><p><strong>但是它们可以有不同的口令、不同的主目录以及不同的登录Shell等。</strong></p>
</li>
<li><p>通常用户标识号的取值范围是0～65 535。</p>
<ul>
<li><strong>0是超级用户roo</strong>t的标识号，1～99由系统保留，作为管理账号</li>
<li><strong>普通用户的标识号从100开始</strong>。在Linux系统中，这个界限是500。</li>
</ul>
</li>
</ul>
<ol start="4">
<li><strong>组id</strong></li>
</ol>
<ul>
<li><strong>它对应着<code>/etc/group</code>文件中的一条记录。</strong></li>
</ul>
<ol start="5">
<li><strong>注释性描述</strong></li>
</ol>
<ul>
<li>例如用户的真实姓名、电话、地址等，这个字段并没有什么实际的用途。在不同的Linux 系统中，这个字段的格式并没有统一。在许多Linux系统中，这个字段存放的是一段任意的注释性描述文字，用做finger命令的输出。</li>
</ul>
<ol start="6">
<li><strong>用户的工作目录</strong></li>
</ol>
<ul>
<li>它是用户在登录到系统之后所处的目录。在大多数系统中，各用户的主目录都被组织在同一个特定的目录下，而用户主目录的名称就是该用户的登录名。</li>
<li>各用户对自己的主目录有读、写、执行（搜索）权限，其他用户对此目录的访问权限则根据具体情况设置。</li>
</ul>
<ol start="7">
<li><strong>用户使用的shell</strong></li>
</ol>
<ul>
<li><strong>用户登录后，要启动一个进程，负责将用户的操作传递给内核，这个进程是用户登录到系统后运行的命令解释器或者某个特定的程序（<code>shell</code>）</strong></li>
<li>Shell是用户与Linux系统之间的接口。<strong>Linux的Shell有许多种</strong>，每种都有不同的特点。<ul>
<li><strong>常用的有<code>sh(Bourne Shell), csh(C Shell), ksh(Korn Shell), tcsh(TENEX/TOPS-20 type C Shell), bash(Bourne Again Shell)</code>等。</strong></li>
<li>系统管理员可以根据系统情况和用户习惯为用户指定某个Shell。如果不指定Shell，那么系统使用sh为默认的登录Shell，即这个字段的值为/bin/sh。</li>
<li>利用这一特点，我们可以限制用户只能运行指定的应用程序,在该应用程序运行结束后，用户就自动退出了系统</li>
<li>有些Linux 系统要求只有那些在系统中登记了的程序才能出现在这个字段中。</li>
</ul>
</li>
</ul>
<ol start="8">
<li><strong>伪用户</strong></li>
</ol>
<ul>
<li>这些用户在/etc/passwd文件中也占有一条记录，但是不能登录，因为它们的登录Shell为空</li>
<li>它们的存在主要是方便系统管理，<strong>满足相应的系统进程对文件属主的要求。</strong></li>
</ul>
<p><strong>常见的伪用户如下所示：</strong></p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">伪 用 户 含 义 </span><br><span class="line">bin 拥有可执行的用户命令文件 </span><br><span class="line">sys 拥有系统文件 </span><br><span class="line">adm 拥有帐户文件 </span><br><span class="line">uucp UUCP使用 </span><br><span class="line">lp lp或lpd子系统使用 </span><br><span class="line">nobody NFS使用</span><br></pre></td></tr></table></figure>



<p><strong>注意：</strong></p>
<ul>
<li><strong>在<code>/etc/passwd</code> 中新增加一行 相当于手动的创建了一个新用户  `useradd</strong>`</li>
</ul>
<h4 id="2-etc-shadow"><a href="#2-etc-shadow" class="headerlink" title="2. /etc/shadow"></a>2. /etc/shadow</h4><ul>
<li><p>由于<code>/etc/passwd</code>文件是所有用户都可读的，如果用户的密码太简单或规律比较明显的话，一台普通的计算机就能够很容易地将它破解，因此对安全性要求较高的Linux系统都把<strong>加密后的口令字分离出来，单独存放在一个文件中，这个文件是/etc/shadow文件</strong>。 有超级用户才拥有该文件读权限，这就保证了用户密码的安全性。</p>
</li>
<li><p><strong>/etc/shadow中的记录行与/etc/passwd中的一一对应，它由pwconv命令根据/etc/passwd中的数据自动产生</strong></p>
</li>
<li><p><strong>下面是/etc/shadow的一个例子：</strong></p>
</li>
</ul>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">＃ cat &#x2F;etc&#x2F;shadow</span><br><span class="line"></span><br><span class="line">root:Dnakfw28zf38w:8764:0:168:7:::</span><br><span class="line">daemon:*::0:0::::</span><br><span class="line">bin:*::0:0::::</span><br><span class="line">sys:*::0:0::::</span><br><span class="line">adm:*::0:0::::</span><br><span class="line">uucp:*::0:0::::</span><br><span class="line">nuucp:*::0:0::::</span><br><span class="line">auth:*::0:0::::</span><br><span class="line">cron:*::0:0::::</span><br><span class="line">listen:*::0:0::::</span><br><span class="line">lp:*::0:0::::</span><br><span class="line">sam:EkdiSECLWPdSa:9740:0:0::::</span><br></pre></td></tr></table></figure>



<p><strong>它的文件格式与/etc/passwd类似，由若干个字段组成，字段之间用”:”隔开。这些字段是：</strong></p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">登录名:加密口令:最后一次修改时间:最小时间间隔:最大时间间隔:警告时间:不活动时间:失效时间:标志</span><br></pre></td></tr></table></figure>



<ol>
<li>“登录名”是与/etc/passwd文件中的登录名相一致的用户账号</li>
<li>“口令”字段存放的是加密后的用户口令字，长度为13个字符。如果为空，则对应用户没有口令，登录时不需要口令；如果含有不属于集合 { ./0-9A-Za-z }中的字符，则对应的用户不能登录。</li>
<li>“最后一次修改时间”表示的是从某个时刻起，到用户最后一次修改口令时的天数。时间起点对不同的系统可能不一样。例如在SCO Linux 中，这个时间起点是1970年1月1日。</li>
<li>“最小时间间隔”指的是两次修改口令之间所需的最小天数。</li>
<li>“最大时间间隔”指的是口令保持有效的最大天数。</li>
<li>“警告时间”字段表示的是从系统开始警告用户到用户密码正式失效之间的天数。</li>
<li>“不活动时间”表示的是用户没有登录活动但账号仍能保持有效的最大天数。</li>
<li>“失效时间”字段给出的是一个绝对的天数，如果使用了这个字段，那么就给出相应账号的生存期。期满后，该账号就不再是一个合法的账号，也就不能再用来登录了。</li>
</ol>
<p><strong>注意 ：</strong></p>
<ul>
<li><strong>即使两个用户设置了相同的密码，在配置文件<code>/etc/shadow</code> 中保存的密码显示也是不一样的</strong></li>
</ul>
<h4 id="4-etc-group"><a href="#4-etc-group" class="headerlink" title="4. /etc/group"></a>4. /etc/group</h4><ul>
<li>将用户分组是Linux 系统中对用户进行管理及控制访问权限的一种手段。</li>
<li><strong>每个用户都属于某个用户组；一个组中可以有多个用户，一个用户也可以属于不同的组。(多对多)</strong><ul>
<li>当一个用户同时是多个组中的成员时，在/etc/passwd文件中记录的是用户所属的主组，也就是登录时所属的默认组，而其他组称为附加组。</li>
<li>用户要访问属于附加组的文件时，必须首先使用newgrp命令使自己成为所要访问的组中的成员。</li>
</ul>
</li>
</ul>
<ul>
<li><strong>用户组的所有信息都存放在/etc/group文件中。此文件的格式也类似于/etc/passwd文件，由冒号(:)隔开若干个字段，这些字段有：</strong></li>
</ul>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">组名:口令:组标识号:组内用户列表</span><br></pre></td></tr></table></figure>

<ol>
<li>“组名”是用户组的名称，由字母或数字构成。与/etc/passwd中的登录名一样，组名不应重复。</li>
<li>“口令”字段存放的是用户组加密后的口令字。一般Linux 系统的用户组都没有口令，即这个字段一般为空，或者是*。</li>
<li><strong>“组标识号”与用户标识号类似，也是一个整数，被系统内部用来标识组。(gid)</strong></li>
<li><strong>“组内用户列表”是属于这个组的所有用户的列表</strong>，不同用户之间用逗号(,)分隔。<strong>这个用户组可能是用户的主组，也可能是附加组。</strong></li>
</ol>
<p><strong>/etc/group文件的一个例子如下：</strong></p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">root::0:root</span><br><span class="line">bin::2:root,bin</span><br><span class="line">sys::3:root,uucp</span><br><span class="line">adm::4:root,adm</span><br><span class="line">daemon::5:root,daemon</span><br><span class="line">lp::7:root,lp</span><br><span class="line">users::20:root,sam</span><br></pre></td></tr></table></figure>



<h3 id="3-5-批量添加用户"><a href="#3-5-批量添加用户" class="headerlink" title="3.5 批量添加用户"></a>3.5 批量添加用户</h3><ul>
<li><p>添加和删除用户对每位Linux系统管理员都是轻而易举的事，比较棘手的是如果要添加几十个、上百个甚至上千个用户时，我们不太可能还使用useradd一个一个地添加，必然要找一种简便的创建大量用户的方法。</p>
</li>
<li><p>Linux系统提供了创建大量用户的工具，可以让您立即创建大量用户，方法如下：</p>
</li>
</ul>
<ol>
<li><strong>先编辑一个文本用户文件</strong></li>
</ol>
<ul>
<li>每一列按照<code>/etc/passwd</code>密码文件的格式书写，要注意每个用户的用户名、UID、宿主目录都不可以相同</li>
<li>其中密码栏可以留做空白或输入x号。一个范例文件user.txt内容如下：</li>
</ul>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">user001::600:100:user:&#x2F;home&#x2F;user001:&#x2F;bin&#x2F;bash</span><br><span class="line">user002::601:100:user:&#x2F;home&#x2F;user002:&#x2F;bin&#x2F;bash</span><br><span class="line">user003::602:100:user:&#x2F;home&#x2F;user003:&#x2F;bin&#x2F;bash</span><br><span class="line">user004::603:100:user:&#x2F;home&#x2F;user004:&#x2F;bin&#x2F;bash</span><br><span class="line">user005::604:100:user:&#x2F;home&#x2F;user005:&#x2F;bin&#x2F;bash</span><br><span class="line">user006::605:100:user:&#x2F;home&#x2F;user006:&#x2F;bin&#x2F;bash</span><br></pre></td></tr></table></figure>



<ol start="2">
<li><strong>以root 的身份执行命令<code>/usr/sbin/newusers</code> 并且从刚创建的用户<code>user.txt</code> 中导入数据</strong></li>
</ol>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"># newusers &lt; user.txt</span><br></pre></td></tr></table></figure>

<ul>
<li>然后可以执行命令 <code>vipw</code> 或 <code>vi /etc/passwd</code> 检查 <code>/etc/passwd</code> 文件是否已经出现这些用户的数据，并且用户的宿主目录是否已经创建。</li>
</ul>
<ol start="3">
<li><strong>执行<code>/usr/sbin/pwunconv</code></strong></li>
</ol>
<ul>
<li>将 <code>/etc/shadow</code> 产生的 <code>shadow</code> 密码解码，然后回写到 <code>/etc/passwd</code> 中</li>
<li>并将<code>/etc/shadow</code>的<code>shadow</code>密码栏删掉</li>
<li>这是为了方便下一步的密码转换工作，即先取消 <code>shadow password</code> 功能。</li>
</ul>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"># pwunconv</span><br></pre></td></tr></table></figure>



<ol start="4">
<li><strong>编辑每个用户的密码对照文件</strong></li>
</ol>
<ul>
<li>格式为：</li>
</ul>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">用户名:密码</span><br></pre></td></tr></table></figure>

<ul>
<li>实例文件 <code>passwd.txt</code> 内容如下：</li>
</ul>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">user001:123456</span><br><span class="line">user002:123456</span><br><span class="line">user003:123456</span><br><span class="line">user004:123456</span><br><span class="line">user005:123456</span><br><span class="line">user006:123456</span><br></pre></td></tr></table></figure>



<ol start="5">
<li><strong>以root 身份执行命令 <code>/usr/sbin/chpasswd</code></strong></li>
</ol>
<ul>
<li>创建用户密码，<code>chpasswd</code> 会将经过 <code>/usr/bin/passwd</code> 命令编码过的密码写入 <code>/etc/passwd</code> 的密码栏。</li>
</ul>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"># chpasswd &lt; passwd.txt</span><br></pre></td></tr></table></figure>



<ol start="6">
<li><strong>确定密码经编码写入 <code>/etc/passwd</code> 密码栏后</strong></li>
</ol>
<ul>
<li>执行命令 <code>/usr/sbin/pwconv</code> 将密码编码为 <code>shadow password</code>，并将结果写入 <code>/etc/shadow</code>。</li>
</ul>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"># pwconv</span><br></pre></td></tr></table></figure>



<p>这样就完成了大量用户的创建了，之后您可以到/home下检查这些用户宿主目录的权限设置是否都正确，并登录验证用户密码是否正确。</p>
<h2 id="4-文件权限"><a href="#4-文件权限" class="headerlink" title="4. 文件权限"></a>4. 文件权限</h2><ul>
<li>Linux 系统是一种典型的多用户系统，不同的用户处于不同的地位，拥有不同的权限。</li>
<li>为了保护系统的安全性，<strong>Linux 系统对不同的用户访问同一文件（包括目录文件）的权限做了不同的规定。</strong></li>
<li><strong>在 Linux 中我们通常使用以下两个命令来修改文件或目录的所属用户与权限：</strong><ul>
<li><strong>chown (change ownerp) ： 修改所属用户与组。</strong></li>
<li><strong>chmod (change mode) ： 修改用户的权限。</strong></li>
</ul>
</li>
</ul>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201213/111053345.png" alt="mark"></p>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201213/111535015.png" alt="mark"></p>
<h3 id="4-1-文件属性"><a href="#4-1-文件属性" class="headerlink" title="4.1 文件属性"></a>4.1 文件属性</h3><p>每个文件的属性由左边第一部分的 10 个字符来确定（如下图）。</p>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201213/112201603.png" alt="mark"></p>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201213/111643005.png" alt="mark"></p>
<ul>
<li><p>从左至右用 <strong>0-9</strong> 这些数字来表示。</p>
</li>
<li><p>第 <strong>0</strong> 位确定文件类型，</p>
</li>
<li><p>第 <strong>1-3</strong> 位确定属主（该文件的所有者）拥有该文件的权限。</p>
</li>
<li><p>第 <strong>4-6</strong> 位确定属组（所有者的同组用户）拥有该文件的权限</p>
</li>
</ul>
<p>*<em>权限对应 r w  x *</em></p>
<ul>
<li>其中，第 <strong>1、4、7</strong> 位表示读权限，如果用 <strong>r</strong> 字符表示，则有读权限，如果用 <strong>-</strong> 字符表示，则没有读权限；</li>
<li>第 <strong>2、5、8</strong> 位表示写权限，如果用 <strong>w</strong> 字符表示，则有写权限，如果用 <strong>-</strong> 字符表示没有写权限；</li>
<li>第 <strong>3、6、9</strong> 位表示可执行权限，如果用 <strong>x</strong> 字符表示，则有执行权限，如果用 <strong>-</strong> 字符表示，则没有执行权限。</li>
</ul>
<ol>
<li><strong>文件类型</strong></li>
</ol>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201213/112314719.png" alt="mark"></p>
<p>在 Linux 中第一个字符代表这个文件是目录、文件或链接文件等等。</p>
<ul>
<li>当为 <strong>d</strong> 则是目录</li>
<li>当为 <strong>-</strong> 则是文件；</li>
<li>若是 <strong>l</strong> 则表示为链接文档(link file)；</li>
<li>若是 <strong>b</strong> 则表示为装置文件里面的可供储存的接口设备(可随机存取装置)；</li>
<li>若是 <strong>c</strong> 则表示为装置文件里面的串行端口设备，例如键盘、鼠标(一次性读取装置)。</li>
</ul>
<h3 id="4-2-文件权限表示方法"><a href="#4-2-文件权限表示方法" class="headerlink" title="4.2 文件权限表示方法"></a>4.2 文件权限表示方法</h3><p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201213/142745085.png" alt="mark"></p>
<h3 id="4-3-权限的修改"><a href="#4-3-权限的修改" class="headerlink" title="4.3 权限的修改"></a>4.3 权限的修改</h3><p>在 Linux 中我们通常使用以下两个命令来修改文件或目录的所属用户与权限：</p>
<ul>
<li><strong>chown (change ownerp) ： 修改所属用户与组。</strong></li>
<li><strong>chmod (change mode) ： 修改用户的权限。</strong></li>
</ul>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201213/143101413.png" alt="mark"></p>
<h4 id="1-chown-更改属组-属主"><a href="#1-chown-更改属组-属主" class="headerlink" title="1. chown : 更改属组 属主"></a>1. chown : 更改属组 属主</h4><ul>
<li><p>对于文件来说，它都有一个特定的所有者，也就是对该文件具有所有权的用户。</p>
</li>
<li><p>同时，在Linux系统中，用户是按组分类的，一个用户属于一个或多个组。</p>
</li>
<li><p><strong>文件所有者以外的用户又可以分为文件所有者的同组用户和其他用户。</strong></p>
</li>
<li><p><strong>因此，Linux系统按文件所有者、文件所有者同组用户和其他用户来规定了不同的文件访问权限。</strong></p>
</li>
</ul>
<p><strong>举例</strong></p>
<ol>
<li><strong>新建一个默认的目录<code>mkdir test</code></strong></li>
</ol>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201213/143510393.png" alt="mark"></p>
<ol start="2">
<li><strong>新建<code>user1,user2,user3</code>用户 并且设置组环境</strong><ul>
<li><code>useradd user1</code></li>
<li><code>useradd user2</code></li>
<li><code>useradd user3</code></li>
</ul>
</li>
</ol>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201213/144048627.png" alt="mark"></p>
<ol start="3">
<li><strong>对目录修改属主和属组</strong></li>
</ol>
<ul>
<li><strong>修改属主</strong><ul>
<li><code>chown user1 test/</code></li>
<li><code>ls -ld test/</code></li>
</ul>
</li>
</ul>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201213/144320654.png" alt="mark"></p>
<ul>
<li><strong>修改属组</strong><ul>
<li><code>chown :group1 test/</code></li>
<li><code>ls -ld test/</code></li>
</ul>
</li>
</ul>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201213/144442914.png" alt="mark"></p>
<p><strong>注意：</strong></p>
<ul>
<li><strong>权限限制是限制非root 用户的 ，即使root用户没有赋予任何权限，还是可以修改文件</strong></li>
</ul>
<h4 id="2-chgrp-：-更改属组"><a href="#2-chgrp-：-更改属组" class="headerlink" title="2. chgrp ： 更改属组"></a>2. chgrp ： 更改属组</h4><p><strong>语法：</strong></p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">chgrp [-R] 属组名 文件名</span><br></pre></td></tr></table></figure>

<p>参数选项</p>
<ul>
<li>-R：递归更改文件属组，就是在更改某个目录文件的属组时，如果加上-R的参数，<strong>那么该目录下的所有文件的属组都会更改。</strong></li>
</ul>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201213/144748681.png" alt="mark"></p>
<h4 id="3-chmod-：-更改文件9个属性"><a href="#3-chmod-：-更改文件9个属性" class="headerlink" title="3. chmod ： 更改文件9个属性"></a>3. chmod ： 更改文件9个属性</h4><ul>
<li><p><strong>Linux文件属性有两种设置方法，一种是数字，一种是符号。</strong></p>
</li>
<li><p><strong>Linux 文件的基本权限就有九个，</strong></p>
<ul>
<li><strong>分别是 owner/group/others(拥有者/组/其他) 三种身份</strong></li>
<li><strong>各有自己的 read/write/execute 权限。</strong></li>
</ul>
</li>
</ul>
<ol>
<li><strong>字符修改权限</strong></li>
</ol>
<p>从之前的介绍中我们可以发现，基本上就九个权限分别是：</p>
<ul>
<li>user：用户</li>
<li>group：组</li>
<li>others：其他</li>
</ul>
<p><strong>那么我们就可以使用 u, g, o 来代表三种身份的权限。</strong></p>
<p>此外， <strong>a</strong> 则代表 <strong>all</strong>，即全部的身份。读写的权限可以写成 <strong>r, w, x</strong>，也就是可以使用下表的方式来看：</p>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201213/145155332.png" alt="mark"></p>
<p><strong>举例</strong></p>
<ul>
<li>如果我们需要将文件权限设置为 <strong>-rwxr-xr–</strong> ，可以使用 <strong>chmod u=rwx,g=rx,o=r 文件名</strong> 来设定:</li>
</ul>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#  touch test1    // 创建 test1 文件</span></span><br><span class="line"><span class="comment"># ls -al test1    // 查看 test1 默认权限</span></span><br><span class="line">-rw-r--r-- 1 root root 0 Nov 15 10:32 test1</span><br><span class="line"><span class="comment"># chmod u=rwx,g=rx,o=r  test1    // 修改 test1 权限</span></span><br><span class="line"><span class="comment"># ls -al test1</span></span><br><span class="line">-rwxr-xr-- 1 root root 0 Nov 15 10:32 test1</span><br></pre></td></tr></table></figure>

<ul>
<li><p>而如果是要将权限去掉而不改变其他已存在的权限呢？例如要拿掉全部人的可执行权限，则：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#  chmod  a-x test1</span></span><br><span class="line"><span class="comment"># ls -al test1</span></span><br><span class="line">-rw-r--r-- 1 root root 0 Nov 15 10:32 test1</span><br></pre></td></tr></table></figure>



</li>
</ul>
<ol start="2">
<li><strong>数字权限</strong></li>
</ol>
<p>先复习一下刚刚上面提到的数据：文件的权限字符为： <strong>-rwxrwxrwx</strong> ， 这九个权限是三个三个一组的！其中，我们可以使用数字来代表各个权限，各权限的分数对照表如下：</p>
<ul>
<li><strong>r:4</strong></li>
<li><strong>w:2</strong></li>
<li><strong>x:1</strong></li>
</ul>
<p>每种身份(<code>owner/group/others</code>)各自的三个权限(r/w/x)分数是需要累加的，例如当权限为： <strong>-rwxrwx—</strong> 分数则是：</p>
<ul>
<li><code>owner = rwx = 4+2+1 = 7</code></li>
<li><code>group = rwx = 4+2+1 = 7</code></li>
<li><code>others= --- = 0+0+0 = 0</code></li>
</ul>
<p>所以等一下我们设定权限的变更时，该文件的权限数字就是 <strong>770</strong>。变更权限的指令 chmod 的语法是这样的：</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">chmod [-R] xyz 文件或目录</span><br></pre></td></tr></table></figure>

<p><strong>选项与参数：</strong></p>
<ul>
<li><strong>xyz : 就是刚刚提到的数字类型的权限属性，为 rwx 属性数值的相加。</strong></li>
<li><strong>-R : 进行递归(recursive)的持续变更，亦即连同次目录下的所有文件都会变更</strong></li>
</ul>
<p><strong>举例来说，如果要将 .bashrc 这个文件所有的权限都设定启用，那么命令如下：</strong></p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">[root@www ~]# ls -al .bashrc</span><br><span class="line">-rw-r--r--  1 root root 395 Jul  4 11:45 .bashrc</span><br><span class="line">[root@www ~]# chmod 777 .bashrc</span><br><span class="line">[root@www ~]# ls -al .bashrc</span><br><span class="line">-rwxrwxrwx  1 root root 395 Jul  4 11:45 .bashrc</span><br></pre></td></tr></table></figure>

<p>那如果要将权限变成 <em>-rwxr-xr–</em> 呢？那么权限的分数就成为 754。</p>
<h4 id="4-默认文件权限644由来"><a href="#4-默认文件权限644由来" class="headerlink" title="4. 默认文件权限644由来"></a>4. 默认文件权限644由来</h4><ol>
<li><code>umask = 0022</code></li>
<li><code>666 - 0022 = 644</code></li>
</ol>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201213/150121943.png" alt="mark"></p>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201213/150232060.png" alt="mark"></p>
<p><strong>注意 ：</strong></p>
<ol>
<li><p><strong>文件具体的权限以用户的权限为主</strong></p>
<ul>
<li><strong>如果发生权限冲突，即有种情况：用户没有权限但是属组有权限，该用户仍然没有权限，但是该组下其他用户是有对应权限的。</strong></li>
</ul>
</li>
<li><p><strong>目录的具体权限</strong></p>
<ul>
<li><strong><code>x</code> 表示可以进入目录的权限</strong></li>
<li><code>进入目录并且查看 需要 rx权限</code></li>
<li><code>进入目录并且删除文件 需要 wx权限</code></li>
</ul>
</li>
</ol>
<h4 id="5-特殊权限"><a href="#5-特殊权限" class="headerlink" title="5. 特殊权限"></a>5. 特殊权限</h4><p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201215/164053623.png" alt="mark"></p>
<ol>
<li><strong><code>SUID</code> : 获取属主权限</strong> <ul>
<li><strong>比如用户修改自己的密码</strong></li>
</ul>
</li>
</ol>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201215/164651088.png" alt="mark"></p>
<ol start="2">
<li><strong><code>SGID</code> : 文件共享时，权限改为该目录的属组</strong></li>
<li><strong><code>SBIT</code> :  防止自己的文件被其他普通用户误删掉</strong></li>
</ol>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201215/164924045.png" alt="mark"></p>
<ul>
<li><strong>增加特殊权限</strong><ul>
<li><strong>SUID : <code>chmod 4xxx</code>   xxx为原有的权限</strong></li>
<li><strong>SBIT : <code>chmod 1xxx</code>    xxx为原有的权限</strong></li>
</ul>
</li>
</ul>
<h2 id="5-网络管理"><a href="#5-网络管理" class="headerlink" title="5. 网络管理"></a>5. 网络管理</h2><p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201215/165552875.png" alt="mark"></p>
<h3 id="5-1-网络状态的查看"><a href="#5-1-网络状态的查看" class="headerlink" title="5.1 网络状态的查看"></a>5.1 网络状态的查看</h3><p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201215/165748465.png" alt="mark"></p>
<ol>
<li><strong>net-tools 适用于 centos7 之前的系统</strong></li>
<li><strong>iproute2 适用于 centos7 以后的系统</strong></li>
</ol>
<h4 id="1-ifconfig"><a href="#1-ifconfig" class="headerlink" title="1. ifconfig"></a>1. ifconfig</h4><p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201215/170029026.png" alt="mark"></p>
<ol>
<li><strong>if = interface缩写（if）</strong></li>
<li><strong>第一块网卡的不同命名</strong>  <ul>
<li>对于服务器来说 如果服务器很多 那么批量操作就显得不便捷</li>
</ul>
</li>
<li><strong>普通用户</strong>查看 <code>sbin/ifconfig</code> 进行网络查看</li>
</ol>
<p><strong>注意： 如何重写网卡名回到eth0</strong></p>
<p> <img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201215/171945267.png" alt="mark"></p>
<figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line">[root@zhuuu <span class="built_in">test</span>]<span class="comment"># ifconfig</span></span><br><span class="line">eth0: flags=4163&lt;UP,BROADCAST,RUNNING,MULTICAST&gt;  mtu 1500</span><br><span class="line">        inet 172.21.0.6  netmask 255.255.240.0  broadcast 172.21.15.255 <span class="comment"># ip地址 子网掩码 广播地址</span></span><br><span class="line">        inet6 fe80::5054:ff:fe02:6706  prefixlen 64  scopeid 0x20&lt;link&gt;</span><br><span class="line">        ether 52:54:00:02:67:06  txqueuelen 1000  (Ethernet)</span><br><span class="line">        RX packets 3234415  bytes 289214162 (275.8 MiB)	<span class="comment"># 发送数据包个数 和 大小</span></span><br><span class="line">        RX errors 0  dropped 0  overruns 0  frame 0</span><br><span class="line">        TX packets 3149017  bytes 549055111 (523.6 MiB) <span class="comment"># 接受数据包个数 和 大小</span></span><br><span class="line">        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0</span><br><span class="line"></span><br><span class="line"><span class="comment"># lo 本地环回</span></span><br><span class="line">lo: flags=73&lt;UP,LOOPBACK,RUNNING&gt;  mtu 65536</span><br><span class="line">        inet 127.0.0.1  netmask 255.0.0.0</span><br><span class="line">        inet6 ::1  prefixlen 128  scopeid 0x10&lt;host&gt;</span><br><span class="line">        loop  txqueuelen 1000  (Local Loopback)</span><br><span class="line">        RX packets 4450  bytes 218920 (213.7 KiB)</span><br><span class="line">        RX errors 0  dropped 0  overruns 0  frame 0</span><br><span class="line">        TX packets 4450  bytes 218920 (213.7 KiB)</span><br><span class="line">        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0</span><br></pre></td></tr></table></figure>



<h4 id="2-mii-tool"><a href="#2-mii-tool" class="headerlink" title="2. mii-tool"></a>2. mii-tool</h4><p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201215/172847300.png" alt="mark"></p>
<p><strong>注意：</strong></p>
<ul>
<li><strong>虚拟机/云服务器不支持此命令查看</strong></li>
</ul>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201215/173304520.png" alt="mark"></p>
<h4 id="3-route"><a href="#3-route" class="headerlink" title="3. route"></a>3. route</h4><p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201215/172922241.png" alt="mark"></p>
<ol>
<li><strong><code>route</code> 中的 ip 会变成域名</strong></li>
<li><strong><code>route -n</code> 不会反解ip 为域名</strong></li>
</ol>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201215/173452329.png" alt="mark"></p>
<h3 id="5-2-网络配置的修改"><a href="#5-2-网络配置的修改" class="headerlink" title="5.2 网络配置的修改"></a>5.2 网络配置的修改</h3><h4 id="1-ifup-ifdown"><a href="#1-ifup-ifdown" class="headerlink" title="1. ifup ifdown"></a>1. ifup ifdown</h4><p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201215/173615526.png" alt="mark"></p>
<ol>
<li><p><strong>启动关闭指定网卡</strong></p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"># ifconfig eth0 down</span><br><span class="line"># ifconfig eth0 up</span><br></pre></td></tr></table></figure>



</li>
</ol>
<h4 id="2-网关配置"><a href="#2-网关配置" class="headerlink" title="2. 网关配置"></a>2. 网关配置</h4><p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201215/173651195.png" alt="mark"></p>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201215/190418802.png" alt="mark"></p>
<p><strong>指定明细路由</strong></p>
<ol>
<li><strong>指定走特定ip 使用特定的路由</strong></li>
</ol>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201215/190635734.png" alt="mark"></p>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201215/190654328.png" alt="mark"></p>
<ol start="2">
<li><strong>指定走特定的网段 使用特定的路由</strong></li>
</ol>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201215/190815409.png" alt="mark"></p>
<h4 id="3-ip-命令"><a href="#3-ip-命令" class="headerlink" title="3. ip 命令"></a>3. ip 命令</h4><p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201215/184014703.png" alt="mark"></p>
<p><strong>注意：</strong></p>
<ul>
<li><strong>云服务器暂时不需要改动，因为改动可能就连不上了</strong></li>
</ul>
<h3 id="5-3-网络故障的排除（服务上线网络问题）"><a href="#5-3-网络故障的排除（服务上线网络问题）" class="headerlink" title="5.3 网络故障的排除（服务上线网络问题）"></a>5.3 网络故障的排除（服务上线网络问题）</h3><p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201216/170800833.png" alt="mark"></p>
<h4 id="1-ping"><a href="#1-ping" class="headerlink" title="1. ping"></a>1. ping</h4><ul>
<li><strong>执行ping指令会使用ICMP传输协议</strong>，发出要求回应的信息，若远端主机的网络功能没有问题，就会回应该信息，因而得知该主机运作正常。</li>
</ul>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ping [-dfnqrRv][-c&lt;完成次数&gt;][-i&lt;间隔秒数&gt;][-I&lt;网络界面&gt;][-l&lt;前置载入&gt;][-p&lt;范本样式&gt;][-s&lt;数据包大小&gt;][-t&lt;存活数值&gt;][主机名称或IP地址]</span><br></pre></td></tr></table></figure>

<p><strong>参数说明</strong>：</p>
<ul>
<li>-d 使用Socket的SO_DEBUG功能。</li>
<li><strong>-c&lt;完成次数&gt; 设置完成要求回应的次数。</strong></li>
<li>-f 极限检测。</li>
<li>-i&lt;间隔秒数&gt; 指定收发信息的间隔时间。</li>
<li>-I&lt;网络界面&gt; 使用指定的网络接口送出数据包。</li>
<li>-l&lt;前置载入&gt; 设置在送出要求信息之前，先行发出的数据包。</li>
<li>-n 只输出数值。</li>
<li>-p&lt;范本样式&gt; 设置填满数据包的范本样式。</li>
<li>-q 不显示指令执行过程，开头和结尾的相关信息除外。</li>
<li>-r 忽略普通的Routing Table，直接将数据包送到远端主机上。</li>
<li>-R 记录路由过程。</li>
<li>-s&lt;数据包大小&gt; 设置数据包的大小。</li>
<li>-t&lt;存活数值&gt; 设置存活数值TTL的大小。</li>
<li>-v 详细显示指令的执行过程。</li>
</ul>
<p><strong>举例子</strong></p>
<ol>
<li><strong>检测是否与主机连通</strong></li>
</ol>
<figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># ping www.w3cschool.cc //ping主机</span></span><br><span class="line">PING aries.m.alikunlun.com (114.80.174.110) 56(84) bytes of data.</span><br><span class="line">64 bytes from 114.80.174.110: icmp_seq=1 ttl=64 time=0.025 ms</span><br><span class="line">64 bytes from 114.80.174.110: icmp_seq=2 ttl=64 time=0.036 ms</span><br><span class="line">64 bytes from 114.80.174.110: icmp_seq=3 ttl=64 time=0.034 ms</span><br><span class="line">64 bytes from 114.80.174.110: icmp_seq=4 ttl=64 time=0.034 ms</span><br><span class="line">64 bytes from 114.80.174.110: icmp_seq=5 ttl=64 time=0.028 ms</span><br><span class="line">64 bytes from 114.80.174.110: icmp_seq=6 ttl=64 time=0.028 ms</span><br><span class="line">64 bytes from 114.80.174.110: icmp_seq=7 ttl=64 time=0.034 ms</span><br><span class="line">64 bytes from 114.80.174.110: icmp_seq=8 ttl=64 time=0.034 ms</span><br><span class="line">64 bytes from 114.80.174.110: icmp_seq=9 ttl=64 time=0.036 ms</span><br><span class="line">64 bytes from 114.80.174.110: icmp_seq=10 ttl=64 time=0.041 ms</span><br><span class="line"></span><br><span class="line">--- aries.m.alikunlun.com ping statistics ---</span><br><span class="line">10 packets transmitted, 30 received, 0% packet loss, time 29246ms</span><br><span class="line">rtt min/avg/max/mdev = 0.021/0.035/0.078/0.011 ms</span><br><span class="line"></span><br><span class="line">//需要手动终止Ctrl+C</span><br></pre></td></tr></table></figure>



<ol start="2">
<li><p><strong>指定接收包的次数</strong></p>
<figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># ping -c 2 www.w3cschool.cc</span></span><br><span class="line">PING aries.m.alikunlun.com (114.80.174.120) 56(84) bytes of data.</span><br><span class="line">64 bytes from 114.80.174.120: icmp_seq=1 ttl=54 time=6.18 ms</span><br><span class="line">64 bytes from 114.80.174.120: icmp_seq=2 ttl=54 time=15.4 ms</span><br><span class="line"></span><br><span class="line">--- aries.m.alikunlun.com ping statistics ---</span><br><span class="line">2 packets transmitted, 2 received, 0% packet loss, time 1016ms</span><br><span class="line">rtt min/avg/max/mdev = 6.185/10.824/15.464/4.640 ms</span><br><span class="line"></span><br><span class="line">//收到两次包后，自动退出</span><br></pre></td></tr></table></figure>



</li>
</ol>
<ol start="3">
<li><p><strong>多参数使用</strong></p>
<figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># ping -i 3 -s 1024 -t 255 g.cn //ping主机</span></span><br><span class="line">PING g.cn (203.208.37.104) 1024(1052) bytes of data.</span><br><span class="line">1032 bytes from <span class="built_in">bg</span>-in-f104.1e100.net (203.208.37.104): icmp_seq=0 ttl=243 time=62.5 ms</span><br><span class="line">1032 bytes from <span class="built_in">bg</span>-in-f104.1e100.net (203.208.37.104): icmp_seq=1 ttl=243 time=63.9 ms</span><br><span class="line">1032 bytes from <span class="built_in">bg</span>-in-f104.1e100.net (203.208.37.104): icmp_seq=2 ttl=243 time=61.9 ms</span><br><span class="line"></span><br><span class="line">--- g.cn ping statistics ---</span><br><span class="line">3 packets transmitted, 3 received, 0% packet loss, time 6001ms</span><br><span class="line">rtt min/avg/max/mdev = 61.959/62.843/63.984/0.894 ms, pipe 2</span><br><span class="line">[root@linux ~]<span class="comment"># </span></span><br><span class="line"></span><br><span class="line">//-i 3 发送周期为 3秒 -s 设置发送包的大小 -t 设置TTL值为 255</span><br></pre></td></tr></table></figure>



</li>
</ol>
<h4 id="2-traceroute"><a href="#2-traceroute" class="headerlink" title="2. traceroute"></a>2. traceroute</h4><ul>
<li><code>Linux traceroute</code>命令用于显示数据包到主机间的路径。</li>
<li><code>traceroute</code>指令让<strong>你追踪网络数据包的路由途径</strong>，预设数据包大小是40Bytes，用户可另行设置。</li>
</ul>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">traceroute [-dFlnrvx][-f&lt;存活数值&gt;][-g&lt;网关&gt;...][-i&lt;网络界面&gt;][-m&lt;存活数值&gt;][-p&lt;通信端口&gt;][-s&lt;来源地址&gt;][-t&lt;服务类型&gt;][-w&lt;超时秒数&gt;][主机名称或IP地址][数据包大小]</span><br></pre></td></tr></table></figure>

<p><strong>参数说明</strong>：</p>
<ul>
<li>-d 使用Socket层级的排错功能。</li>
<li>-f&lt;存活数值&gt; 设置第一个检测数据包的存活数值TTL的大小。</li>
<li>-F 设置勿离断位。</li>
<li>-g&lt;网关&gt; 设置来源路由网关，最多可设置8个。</li>
<li>-i&lt;网络界面&gt; 使用指定的网络界面送出数据包。</li>
<li>-I 使用ICMP回应取代UDP资料信息。</li>
<li>-m&lt;存活数值&gt; 设置检测数据包的最大存活数值TTL的大小。</li>
<li>-n 直接使用IP地址而非主机名称。</li>
<li>-p&lt;通信端口&gt; 设置UDP传输协议的通信端口。</li>
<li>-r 忽略普通的Routing Table，直接将数据包送到远端主机上。</li>
<li>-s&lt;来源地址&gt; 设置本地主机送出数据包的IP地址。</li>
<li>-t&lt;服务类型&gt; 设置检测数据包的TOS数值。</li>
<li>-v 详细显示指令的执行过程。</li>
<li><strong>-w&lt;超时秒数&gt; 设置等待远端主机回报的时间。</strong></li>
<li>-x 开启或关闭数据包的正确性检验。</li>
</ul>
<p><strong>举例子：</strong></p>
<ol>
<li><strong>追踪到 百度页面 等待时间1秒</strong></li>
</ol>
<p><code>traceroute -w 1 www.baidu.com</code></p>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201216/171630478.png" alt="mark"></p>
<h4 id="3-mtr"><a href="#3-mtr" class="headerlink" title="3. mtr"></a>3. mtr</h4><ul>
<li>输入mtr后进入该界面</li>
<li><strong>显示主机之间的通信（常用）</strong></li>
</ul>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201216/171718804.png" alt="mark"></p>
<h4 id="4-nslookup"><a href="#4-nslookup" class="headerlink" title="4. nslookup"></a>4. nslookup</h4><ul>
<li><strong>将域名解析为 ip 地址</strong></li>
</ul>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201216/171919025.png" alt="mark"></p>
<h4 id="5-telnet"><a href="#5-telnet" class="headerlink" title="5. telnet"></a>5. telnet</h4><ul>
<li><code>Linux telnet</code>命令用于远端登入。</li>
<li>执行<code>telnet</code>指令开启终端机阶段作业，并登入远端主机。</li>
</ul>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">telnet [-8acdEfFKLrx][-b&lt;主机别名&gt;][-e&lt;脱离字符&gt;][-k&lt;域名&gt;][-l&lt;用户名称&gt;][-n&lt;记录文件&gt;][-S&lt;服务类型&gt;][-X&lt;认证形态&gt;][主机名称或IP地址&lt;通信端口&gt;]</span><br></pre></td></tr></table></figure>

<p><strong>参数说明</strong>：</p>
<ul>
<li>-8 允许使用8位字符资料，包括输入与输出。</li>
<li>-a 尝试自动登入远端系统。</li>
<li>-b&lt;主机别名&gt; 使用别名指定远端主机名称。</li>
<li>-c 不读取用户专属目录里的.telnetrc文件。</li>
<li>-d 启动排错模式。</li>
<li>-e&lt;脱离字符&gt; 设置脱离字符。</li>
<li>-E 滤除脱离字符。</li>
<li>-f 此参数的效果和指定”-F”参数相同。</li>
<li>-F 使用Kerberos V5认证时，加上此参数可把本地主机的认证数据上传到远端主机。</li>
<li>-k&lt;域名&gt; 使用Kerberos认证时，加上此参数让远端主机采用指定的领域名，而非该主机的域名。</li>
<li>-K 不自动登入远端主机。</li>
<li>-l&lt;用户名称&gt; 指定要登入远端主机的用户名称。</li>
<li>-L 允许输出8位字符资料。</li>
<li>-n&lt;记录文件&gt; 指定文件记录相关信息。</li>
<li>-r 使用类似rlogin指令的用户界面。</li>
<li>-S&lt;服务类型&gt; 设置telnet连线所需的IP TOS信息。</li>
<li>-x 假设主机有支持数据加密的功能，就使用它。</li>
<li>-X&lt;认证形态&gt; 关闭指定的认证形态。</li>
</ul>
<p>举例子：</p>
<ol>
<li><strong>查看端口是否畅通</strong></li>
</ol>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201216/172307347.png" alt="mark"></p>
<p><code>telnet 域名/ip 端口号</code></p>
<ol start="2">
<li><strong>退出<code>telnet</code></strong><ul>
<li><strong><code>ctrl + ]</code></strong></li>
<li><strong>再次输入quit</strong></li>
</ul>
</li>
</ol>
<h4 id="6-tcpdump-网络抓包"><a href="#6-tcpdump-网络抓包" class="headerlink" title="6. tcpdump 网络抓包"></a>6. tcpdump 网络抓包</h4><ul>
<li><code>Linux tcpdump</code>命令用于倾倒网络传输数据。</li>
<li>执行<code>tcpdump</code>指令可列出经过指定网络界面的数据包文件头</li>
<li>在<code>Linux</code>操作系统中，你必须是系统管理员。</li>
</ul>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">tcpdump [-adeflnNOpqStvx][-c&lt;数据包数目&gt;][-dd][-ddd][-F&lt;表达文件&gt;][-i&lt;网络界面&gt;][-r&lt;数据包文件&gt;][-s&lt;数据包大小&gt;][-tt][-T&lt;数据包类型&gt;][-vv][-w&lt;数据包文件&gt;][输出数据栏位]</span><br></pre></td></tr></table></figure>

<p><strong>参数说明</strong>：</p>
<ul>
<li>-a 尝试将网络和广播地址转换成名称。</li>
<li>-c&lt;数据包数目&gt; 收到指定的数据包数目后，就停止进行倾倒操作。</li>
<li>-d 把编译过的数据包编码转换成可阅读的格式，并倾倒到标准输出。</li>
<li>-dd 把编译过的数据包编码转换成C语言的格式，并倾倒到标准输出。</li>
<li>-ddd 把编译过的数据包编码转换成十进制数字的格式，并倾倒到标准输出。</li>
<li>-e 在每列倾倒资料上显示连接层级的文件头。</li>
<li>-f 用数字显示网际网络地址。</li>
<li>-F&lt;表达文件&gt; 指定内含表达方式的文件。</li>
<li><strong>-i&lt;网络界面&gt; 使用指定的网络截面送出数据包。</strong></li>
<li>-l 使用标准输出列的缓冲区。</li>
<li><strong>-n 不把主机的网络地址转换成名字。</strong></li>
<li>-N 不列出域名。</li>
<li>-O 不将数据包编码最佳化。</li>
<li>-p 不让网络界面进入混杂模式。</li>
<li>-q 快速输出，仅列出少数的传输协议信息。</li>
<li>-r&lt;数据包文件&gt; 从指定的文件读取数据包数据。</li>
<li>-s&lt;数据包大小&gt; 设置每个数据包的大小。</li>
<li>-S 用绝对而非相对数值列出TCP关联数。</li>
<li>-t 在每列倾倒资料上不显示时间戳记。</li>
<li>-tt 在每列倾倒资料上显示未经格式化的时间戳记。</li>
<li>-T&lt;数据包类型&gt; 强制将表达方式所指定的数据包转译成设置的数据包类型。</li>
<li>-v 详细显示指令执行过程。</li>
<li>-vv 更详细显示指令执行过程。</li>
<li>-x 用十六进制字码列出数据包资料。</li>
<li>-w&lt;数据包文件&gt; 把数据包数据写入指定的文件。</li>
</ul>
<p><strong>举例</strong></p>
<ol>
<li><strong>抓取80端口 不显示域名 的所有数据包</strong></li>
</ol>
<p><code>tcpdump -i any -n port 80</code></p>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201216/172941487.png" alt="mark"></p>
<ol start="2">
<li><strong>抓取特定主机 不显示域名 的所有数据包</strong></li>
</ol>
<p><code>tcpdump -i any -n host 10.0.0.1</code></p>
<ol start="3">
<li><strong>同时抓取ip + port 的数据包</strong></li>
</ol>
<p><code>tcpdump -i any -n host 10.0.0.1 and port 80</code></p>
<ol start="4">
<li><strong>抓取数据包 并 保存成为日志文件</strong></li>
</ol>
<p><code>tcpdump -i any -n host 10.0.0.1 and port 80 -w 指定路径</code></p>
<h4 id="7-netstat"><a href="#7-netstat" class="headerlink" title="7. netstat"></a>7. netstat</h4><ul>
<li><code>Linux netstat</code> 命令用于显示网络状态。</li>
<li>利用 <code>netstat</code> 指令可让你得知整个 Linux 系统的网络情况。</li>
</ul>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">netstat [-acCeFghilMnNoprstuvVwx][-A&lt;网络类型&gt;][--ip]</span><br></pre></td></tr></table></figure>

<p><strong>参数说明</strong>：</p>
<ul>
<li>-a或–all 显示所有连线中的Socket。</li>
<li>-A&lt;网络类型&gt;或–&lt;网络类型&gt; 列出该网络类型连线中的相关地址。</li>
<li>-c或–continuous 持续列出网络状态。</li>
<li>-C或–cache 显示路由器配置的快取信息。</li>
<li>-e或–extend 显示网络其他相关信息。</li>
<li>-F或–fib 显示FIB。</li>
<li>-g或–groups 显示多重广播功能群组组员名单。</li>
<li>-h或–help 在线帮助。</li>
<li>-i或–interfaces 显示网络界面信息表单。</li>
<li><strong>-l或–listening 显示监控中的服务器的Socket。</strong></li>
<li>-M或–masquerade 显示伪装的网络连线。</li>
<li><strong>-n或–numeric 直接使用IP地址，而不通过域名服务器。</strong></li>
<li>-N或–netlink或–symbolic 显示网络硬件外围设备的符号连接名称。</li>
<li>-o或–timers 显示计时器。</li>
<li><strong>-p或–programs 显示正在使用Socket的程序识别码和程序名称。</strong></li>
<li>-r或–route 显示Routing Table。</li>
<li>-s或–statistics 显示网络工作信息统计表。</li>
<li><strong>-t或–tcp 显示TCP传输协议的连线状况。</strong></li>
<li>-u或–udp 显示UDP传输协议的连线状况。</li>
<li>-v或–verbose 显示指令执行过程。</li>
<li>-V或–version 显示版本信息。</li>
<li>-w或–raw 显示RAW传输协议的连线状况。</li>
<li>-x或–unix 此参数的效果和指定”-A unix”参数相同。</li>
<li>–ip或–inet 此参数的效果和指定”-A inet”参数相同。</li>
</ul>
<p><strong>举例</strong></p>
<ol>
<li><strong>不显示域名 监听 tcp 的进程</strong></li>
</ol>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201216/173546348.png" alt="mark"></p>
<h4 id="8-ss"><a href="#8-ss" class="headerlink" title="8. ss"></a>8. ss</h4><ul>
<li><strong>另外一种格式的netstat</strong></li>
</ul>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201216/173827867.png" alt="mark"></p>
<h3 id="5-4-网络服务管理（保存网络配置）"><a href="#5-4-网络服务管理（保存网络配置）" class="headerlink" title="5.4 网络服务管理（保存网络配置）"></a>5.4 网络服务管理（保存网络配置）</h3><ol>
<li><strong>网络服务管理命令</strong></li>
</ol>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201217/111516475.png" alt="mark"></p>
<ul>
<li><strong>SysV : centos 7 之前使用</strong></li>
<li><strong>sytemd : centos 7 之后使用</strong></li>
</ul>
<ol start="2">
<li><strong>网络配置文件</strong></li>
</ol>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201217/111650112.png" alt="mark"></p>
<h4 id="1-查看网卡"><a href="#1-查看网卡" class="headerlink" title="1. 查看网卡"></a>1. 查看网卡</h4><p><code>service network status</code>  ： 查看网卡状态</p>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201217/111955637.png" alt="mark"></p>
<p><code>service network start</code>  :  重新还原默认配置</p>
<h4 id="2-NetworkManager"><a href="#2-NetworkManager" class="headerlink" title="2. NetworkManager"></a>2. NetworkManager</h4><ol>
<li><strong>首先需要禁用上述第一点的 network</strong><ul>
<li><code>chkconfig --list network</code> : 查看network 状态</li>
<li><code>chkconfig --level 2345 network off</code> : 禁用network</li>
</ul>
</li>
</ol>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201217/112326853.png" alt="mark"></p>
<ol start="2">
<li><strong>NetworkManger 的作用</strong><ul>
<li><strong>个人电脑 ： 自动连接Wi-fi网络</strong></li>
<li><strong>服务器 ： 沿用network</strong> <ul>
<li><code>chkconfig --level 2345 network on</code></li>
</ul>
</li>
</ul>
</li>
</ol>
<ol start="3">
<li><strong>禁用NetworkManger</strong><ul>
<li><code>systemctl disable NetworkManager</code></li>
<li><code>systemctl enable NetworkManager</code></li>
</ul>
</li>
</ol>
<h4 id="3-网卡配置文件修改（network-scripts）"><a href="#3-网卡配置文件修改（network-scripts）" class="headerlink" title="3. 网卡配置文件修改（network-scripts）"></a>3. 网卡配置文件修改（network-scripts）</h4><ul>
<li><code>cd /etc/sysconfig/network-scripts/</code></li>
</ul>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">[root@zhuuu ~]# cd &#x2F;etc&#x2F;sysconfig&#x2F;network-scripts&#x2F;</span><br><span class="line">[root@zhuuu network-scripts]# ls</span><br><span class="line">ifcfg-eth0   ifdown-eth   ifdown-post    ifdown-Team      ifup-aliases  ifup-ipv6   ifup-post    ifup-Team      init.ipv6-global</span><br><span class="line">ifcfg-lo     ifdown-ippp  ifdown-ppp     ifdown-TeamPort  ifup-bnep     ifup-isdn   ifup-ppp     ifup-TeamPort  network-functions</span><br><span class="line">ifdown       ifdown-ipv6  ifdown-routes  ifdown-tunnel    ifup-eth      ifup-plip   ifup-routes  ifup-tunnel    network-functions-ipv6</span><br><span class="line">ifdown-bnep  ifdown-isdn  ifdown-sit     ifup             ifup-ippp     ifup-plusb  ifup-sit     ifup-wireless  route6-eth0</span><br></pre></td></tr></table></figure>



<p><strong>举例子</strong></p>
<ol>
<li><code>vim ifcfg-eth0</code> : <strong>默认动态ip配置的网卡</strong></li>
</ol>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201217/113004512.png" alt="mark"></p>
<ol start="2">
<li><strong>静态ip配置修改(重点)</strong><ul>
<li>修改设置生效 ： <code>systemctl restart NetworkManager.service</code></li>
<li>修改设置生效 ： <code>service network restart</code></li>
</ul>
</li>
</ol>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201217/113307108.png" alt="mark"></p>
<h4 id="4-host-修改"><a href="#4-host-修改" class="headerlink" title="4. host 修改"></a>4. host 修改</h4><ol>
<li><code>hostname</code> : 查看自己的主机名</li>
<li><strong>临时修改</strong> ： <code>hostname 修改后的主机名</code></li>
<li><strong>永久修改</strong> ： <code>hostnamectl set-hostname 修改后的主机名</code></li>
</ol>
<p><strong>注意 ： 主机名一旦更改，有其他的配置也需要同时修改</strong></p>
<ul>
<li><code>vim /etc/hosts</code></li>
<li>加入<code>127.0.0.1 修改后的主机名</code></li>
</ul>
<h2 id="6-软件安装"><a href="#6-软件安装" class="headerlink" title="6. 软件安装"></a>6. 软件安装</h2><p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201217/114211348.png" alt="mark"></p>
<ul>
<li><code>redhat,centos : rpm 包</code></li>
<li><code>yum : 仓库</code></li>
</ul>
<h3 id="6-1-软件包的管理器"><a href="#6-1-软件包的管理器" class="headerlink" title="6.1 软件包的管理器"></a>6.1 软件包的管理器</h3><p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201217/114318257.png" alt="mark"></p>
<ul>
<li><strong>rpm ： centos redhat</strong></li>
<li><strong>apt : debian ubuntu</strong></li>
</ul>
<h3 id="6-2-rpm"><a href="#6-2-rpm" class="headerlink" title="6.2 rpm"></a>6.2 rpm</h3><ul>
<li><code>Linux rpm</code> 命令用于管理套件。</li>
<li><code>rpm</code>（英文全拼：<code>redhat package manager</code>） 原本是 <code>Red Hat Linux</code> 发行版专门用来管理 Linux 各项套件的程序，由于它遵循 GPL 规则且功能强大方便，因而广受欢迎。逐渐受到其他发行版的采用。RPM 套件管理方式的出现，让 Linux 易于安装，升级，间接提升了 Linux 的适用度。</li>
</ul>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201217/141128384.png" alt="mark"></p>
<figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">rpm [-acdhilqRsv][-b&lt;完成阶段&gt;&lt;套间档&gt;+][-e&lt;套件挡&gt;][-f&lt;文件&gt;+][-i&lt;套件档&gt;][-p&lt;套件档&gt;＋][-U&lt;套件档&gt;][-vv][--addsign&lt;套件档&gt;+][--allfiles][--allmatches][--badreloc][--buildroot&lt;根目录&gt;][--changelog][--checksig&lt;套件档&gt;+][--clean][--dbpath&lt;数据库目录&gt;][--dump][--excludedocs][--excludepath&lt;排除目录&gt;][--force][--ftpproxy&lt;主机名称或IP地址&gt;][--ftpport&lt;通信端口&gt;][--<span class="built_in">help</span>][--httpproxy&lt;主机名称或IP地址&gt;][--httpport&lt;通信端口&gt;][--ignorearch][--ignoreos][--ignoresize][--includedocs][--initdb][justdb][--nobulid][--nodeps][--nofiles][--nogpg][--nomd5][--nopgp][--noorder][--noscripts][--notriggers][--oldpackage][--percent][--pipe&lt;执行指令&gt;][--prefix&lt;目的目录&gt;][--provides][--queryformat&lt;档头格式&gt;][--querytags][--rcfile&lt;配置档&gt;][--rebulid&lt;套件档&gt;][--rebuliddb][--recompile&lt;套件档&gt;][--relocate&lt;原目录&gt;=&lt;新目录&gt;][--replacefiles][--replacepkgs][--requires][--resign&lt;套件档&gt;+][--rmsource][--rmsource&lt;文件&gt;][--root&lt;根目录&gt;][--scripts][--setperms][--setugids][--short-circuit][--sign][--target=&lt;安装平台&gt;+][--<span class="built_in">test</span>][--timecheck&lt;检查秒数&gt;][--triggeredby&lt;套件档&gt;][--triggers][--verify][--version][--whatprovides&lt;功能特性&gt;][--whatrequires&lt;功能特性&gt;]</span><br></pre></td></tr></table></figure>

<p><strong>参数说明</strong>：</p>
<ul>
<li>-a 　查询所有套件。</li>
<li>-b&lt;完成阶段&gt;&lt;套件档&gt;+或-t &lt;完成阶段&gt;&lt;套件档&gt;+ 　设置包装套件的完成阶段，并指定套件档的文件名称。</li>
<li>-c 　只列出组态配置文件，本参数需配合”-l”参数使用。</li>
<li>-d 　只列出文本文件，本参数需配合”-l”参数使用。</li>
<li><strong>-e&lt;套件档&gt;或–erase&lt;套件档&gt; 　删除指定的套件。</strong></li>
<li>-f&lt;文件&gt;+ 　查询拥有指定文件的套件。</li>
<li>-h或–hash 　套件安装时列出标记。</li>
<li>-i 　显示套件的相关信息。</li>
<li><strong>-i&lt;套件档&gt;或–install&lt;套件档&gt; 　安装指定的套件档。</strong></li>
<li>-l 　显示套件的文件列表。</li>
<li>-p&lt;套件档&gt;+ 　查询指定的RPM套件档。</li>
<li><strong>-q 　使用询问模式，当遇到任何问题时，rpm指令会先询问用户。</strong></li>
<li>-R 　显示套件的关联性信息。</li>
<li>-s 　显示文件状态，本参数需配合”-l”参数使用。</li>
<li>-U&lt;套件档&gt;或–upgrade&lt;套件档&gt; 升级指定的套件档。</li>
<li>-v 　显示指令执行过程。</li>
<li>-vv 　详细显示指令执行过程，便于排错。</li>
<li>-addsign&lt;套件档&gt;+ 　在指定的套件里加上新的签名认证。</li>
<li>–allfiles 　安装所有文件。</li>
<li>–allmatches 　删除符合指定的套件所包含的文件。</li>
<li>–badreloc 　发生错误时，重新配置文件。</li>
<li>–buildroot&lt;根目录&gt; 　设置产生套件时，欲当作根目录的目录。</li>
<li>–changelog 　显示套件的更改记录。</li>
<li>–checksig&lt;套件档&gt;+ 　检验该套件的签名认证。</li>
<li>–clean 　完成套件的包装后，删除包装过程中所建立的目录。</li>
<li>–dbpath&lt;数据库目录&gt; 　设置欲存放RPM数据库的目录。</li>
<li>–dump 　显示每个文件的验证信息。本参数需配合”-l”参数使用。</li>
<li>–excludedocs 　安装套件时，不要安装文件。</li>
<li>–excludepath&lt;排除目录&gt; 　忽略在指定目录里的所有文件。</li>
<li>–force 　强行置换套件或文件。</li>
<li>–ftpproxy&lt;主机名称或IP地址&gt; 　指定FTP代理服务器。</li>
<li>–ftpport&lt;通信端口&gt; 　设置FTP服务器或代理服务器使用的通信端口。</li>
<li>–help 　在线帮助。</li>
<li>–httpproxy&lt;主机名称或IP地址&gt; 　指定HTTP代理服务器。</li>
<li>–httpport&lt;通信端口&gt; 　设置HTTP服务器或代理服务器使用的通信端口。</li>
<li>–ignorearch 　不验证套件档的结构正确性。</li>
<li>–ignoreos 　不验证套件档的结构正确性。</li>
<li>–ignoresize 　安装前不检查磁盘空间是否足够。</li>
<li>–includedocs 　安装套件时，一并安装文件。</li>
<li>–initdb 　确认有正确的数据库可以使用。</li>
<li>–justdb 　更新数据库，当不变动任何文件。</li>
<li>–nobulid 　不执行任何完成阶段。</li>
<li>–nodeps 　不验证套件档的相互关联性。</li>
<li>–nofiles 　不验证文件的属性。</li>
<li>–nogpg 　略过所有GPG的签名认证。</li>
<li>–nomd5 　不使用MD5编码演算确认文件的大小与正确性。</li>
<li>–nopgp 　略过所有PGP的签名认证。</li>
<li>–noorder 　不重新编排套件的安装顺序，以便满足其彼此间的关联性。</li>
<li>–noscripts 　不执行任何安装Script文件。</li>
<li>–notriggers 　不执行该套件包装内的任何Script文件。</li>
<li>–oldpackage 　升级成旧版本的套件。</li>
<li>–percent 　安装套件时显示完成度百分比。</li>
<li>–pipe&lt;执行指令&gt; 　建立管道，把输出结果转为该执行指令的输入数据。</li>
<li>–prefix&lt;目的目录&gt; 　若重新配置文件，就把文件放到指定的目录下。</li>
<li>–provides 　查询该套件所提供的兼容度。</li>
<li>–queryformat&lt;档头格式&gt; 　设置档头的表示方式。</li>
<li>–querytags 　列出可用于档头格式的标签。</li>
<li>–rcfile&lt;配置文件&gt; 　使用指定的配置文件。</li>
<li>–rebulid&lt;套件档&gt; 　安装原始代码套件，重新产生二进制文件的套件。</li>
<li>–rebuliddb 　以现有的数据库为主，重建一份数据库。</li>
<li>–recompile&lt;套件档&gt; 　此参数的效果和指定”–rebulid”参数类似，当不产生套件档。</li>
<li>–relocate&lt;原目录&gt;=&lt;新目录&gt; 　把本来会放到原目录下的文件改放到新目录。</li>
<li>–replacefiles 　强行置换文件。</li>
<li>–replacepkgs 　强行置换套件。</li>
<li>–requires 　查询该套件所需要的兼容度。</li>
<li>–resing&lt;套件档&gt;+ 　删除现有认证，重新产生签名认证。</li>
<li>–rmsource 　完成套件的包装后，删除原始代码。</li>
<li>–rmsource&lt;文件&gt; 　删除原始代码和指定的文件。</li>
<li>–root&lt;根目录&gt; 　设置欲当作根目录的目录。</li>
<li>–scripts 　列出安装套件的Script的变量。</li>
<li>–setperms 　设置文件的权限。</li>
<li>–setugids 　设置文件的拥有者和所属群组。</li>
<li>–short-circuit 　直接略过指定完成阶段的步骤。</li>
<li>–sign 　产生PGP或GPG的签名认证。</li>
<li>–target=&lt;安装平台&gt;+ 　设置产生的套件的安装平台。</li>
<li>–test 　仅作测试，并不真的安装套件。</li>
<li>–timecheck&lt;检查秒数&gt; 　设置检查时间的计时秒数。</li>
<li>–triggeredby&lt;套件档&gt; 　查询该套件的包装者。</li>
<li>–triggers 　展示套件档内的包装Script。</li>
<li>–verify 　此参数的效果和指定”-q”参数相同。</li>
<li>–version 　显示版本信息。</li>
<li>–whatprovides&lt;功能特性&gt; 　查询该套件对指定的功能特性所提供的兼容度。</li>
<li>–whatrequires&lt;功能特性&gt; 　查询该套件对指定的功能特性所需要的兼容度。</li>
</ul>
<p><strong>举个例子</strong></p>
<ol>
<li>安装<code>vim</code></li>
</ol>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201217/140846135.png" alt="mark"></p>
<ol start="2">
<li>查询系统中所有安装的软件包 ：<code>rpm -qa</code>   </li>
<li>分屏显示所有安装的软件包 : <code>rpm -qa | more</code></li>
<li>查询一个单独的软件包版本 : <code>rpm -q 软件名</code></li>
<li>安装软件包 <code>rpm -i 软件名</code></li>
<li>卸载软件包  <code>rpm -e 软件名</code></li>
</ol>
<p><strong>注意：</strong></p>
<ul>
<li><strong>查询Linux设备路径 <code>ls -al /dev</code></strong></li>
<li><strong>Linux 光驱 <code>ls -l /dev/sr0</code></strong></li>
<li>把光驱做成iso 文件 ： <code>dd if=/dev/sr0 of=/xxx/xx.iso</code></li>
<li><strong>挂载光驱 ： <code>mount /dev/sr0 /mnt</code>     注：/mnt 是Linux 用来挂载的目录</strong></li>
</ul>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201217/141912592.png" alt="mark"></p>
<ul>
<li><strong>软件包的依赖问题</strong></li>
</ul>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201217/143922544.png" alt="mark"></p>
<h3 id="6-3-yum"><a href="#6-3-yum" class="headerlink" title="6.3 yum"></a>6.3 yum</h3><ul>
<li>yum（ <code>Yellow dog Updater, Modified</code>）是一个在 Fedora 和 RedHat 以及 SUSE 中的 Shell 前端软件包管理器。</li>
<li><strong>基于 RPM 包管理</strong>，能够<strong>从指定的服务器自动下载 RPM 包并且安装</strong>，可以<strong>自动处理依赖性关系，并且一次安装所有依赖的软体包，无须繁琐地一次次下载、安装。</strong></li>
<li>yum 提供了查找、安装、删除某一个、一组甚至全部软件包的命令，而且命令简洁而又好记。</li>
</ul>
<ol>
<li><strong>yum仓库</strong></li>
</ol>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201217/144153552.png" alt="mark"></p>
<ol start="2">
<li><strong>修改yum 配置文件</strong></li>
</ol>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201217/144240621.png" alt="mark"></p>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201217/144405278.png" alt="mark"></p>
<ol start="3">
<li><strong>yum 常用命令</strong></li>
</ol>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">yum [options] [command] [package ...]</span><br></pre></td></tr></table></figure>

<ul>
<li><strong>options：</strong>可选，选项包括-h（帮助），-y（当安装过程提示选择全部为 “yes”），-q（不显示安装的过程）等等。</li>
<li><strong>command：</strong>要进行的操作。</li>
<li><strong>package：</strong>安装的包名。</li>
</ul>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201217/144428038.png" alt="mark"></p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line">1. 列出所有可更新的软件清单命令：yum check-update</span><br><span class="line"></span><br><span class="line">2. 更新所有软件命令：yum update</span><br><span class="line"></span><br><span class="line">3. 仅安装指定的软件命令：yum install &lt;package_name&gt;</span><br><span class="line"></span><br><span class="line">4. 仅更新指定的软件命令：yum update &lt;package_name&gt;</span><br><span class="line"></span><br><span class="line">5. 列出所有可安裝的软件清单命令：yum list</span><br><span class="line"></span><br><span class="line">6. 删除软件包命令：yum remove &lt;package_name&gt;</span><br><span class="line"></span><br><span class="line">7. 查找软件包命令：yum search &lt;keyword&gt;</span><br><span class="line"></span><br><span class="line">8. 清除缓存命令:</span><br><span class="line"></span><br><span class="line">yum clean packages: 清除缓存目录下的软件包</span><br><span class="line">yum clean headers: 清除缓存目录下的 headers</span><br><span class="line">yum clean oldheaders: 清除缓存目录下旧的 headers</span><br><span class="line">yum clean, yum clean all (&#x3D; yum clean packages; yum clean oldheaders) :清除缓存目录下的软件包及旧的 headers</span><br></pre></td></tr></table></figure>



<h4 id="国内yum-源"><a href="#国内yum-源" class="headerlink" title="国内yum 源"></a>国内yum 源</h4><ul>
<li>网易（163）yum源是国内最好的yum源之一 ，无论是速度还是软件版本，都非常的不错。</li>
<li>将yum源设置为163 yum，可以提升软件包安装和更新的速度，同时避免一些常见软件版本无法找到。</li>
</ul>
<p><strong>安装步骤</strong></p>
<ol>
<li>首先备份/etc/yum.repos.d/CentOS-Base.repo</li>
</ol>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">mv &#x2F;etc&#x2F;yum.repos.d&#x2F;CentOS-Base.repo &#x2F;etc&#x2F;yum.repos.d&#x2F;CentOS-Base.repo.backup</span><br></pre></td></tr></table></figure>

<ol start="2">
<li>下载对应版本 repo 文件, 放入 /etc/yum.repos.d/ (操作前请做好相应备份)</li>
</ol>
<ul>
<li><a href="http://mirrors.163.com/.help/CentOS5-Base-163.repo" target="_blank" rel="noopener">CentOS5</a> ：<a href="http://mirrors.163.com/.help/CentOS5-Base-163.repo" target="_blank" rel="noopener">http://mirrors.163.com/.help/CentOS5-Base-163.repo</a></li>
<li><a href="http://mirrors.163.com/.help/CentOS6-Base-163.repo" target="_blank" rel="noopener">CentOS6</a> ：<a href="http://mirrors.163.com/.help/CentOS6-Base-163.repo" target="_blank" rel="noopener">http://mirrors.163.com/.help/CentOS6-Base-163.repo</a></li>
<li><a href="http://mirrors.163.com/.help/CentOS7-Base-163.repo" target="_blank" rel="noopener">CentOS7</a> ：<a href="http://mirrors.163.com/.help/CentOS7-Base-163.repo" target="_blank" rel="noopener">http://mirrors.163.com/.help/CentOS7-Base-163.repo</a></li>
</ul>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">wget http:&#x2F;&#x2F;mirrors.163.com&#x2F;.help&#x2F;CentOS6-Base-163.repo</span><br><span class="line">mv CentOS6-Base-163.repo CentOS-Base.repo</span><br></pre></td></tr></table></figure>

<ol start="3">
<li>运行以下命令生成缓存</li>
</ol>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">yum clean all</span><br><span class="line">yum makecache</span><br></pre></td></tr></table></figure>

<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201217/145021767.png" alt="mark"></p>
<h3 id="6-4-源代码编译安装"><a href="#6-4-源代码编译安装" class="headerlink" title="6.4 源代码编译安装"></a>6.4 源代码编译安装</h3><ul>
<li><strong>适用于YUM上没有的软件包</strong></li>
</ul>
<ol>
<li><strong>举个例子 ： 流程</strong></li>
</ol>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201217/145605769.png" alt="mark"></p>
<p><strong>注意：</strong></p>
<ol>
<li><strong>如果没有gcc编译器</strong><ul>
<li><code>yum install gcc gcc-c++</code></li>
</ul>
</li>
<li><strong>缺少库</strong><ul>
<li><code>yum install 软件名</code></li>
</ul>
</li>
</ol>
<h3 id="6-5-升级内核"><a href="#6-5-升级内核" class="headerlink" title="6.5 升级内核"></a>6.5 升级内核</h3><p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201218/085623218.png" alt="mark"></p>
<ol>
<li><p><strong>查询内核版本 <code>uname -r</code></strong></p>
</li>
<li><p><strong>rpm 方式安装和 yum方式安装</strong></p>
</li>
<li><p><strong>源代码编译方式安装内核</strong></p>
</li>
<li><p><strong>查看 cpu 核心 <code>lscpu</code></strong></p>
</li>
</ol>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201218/085742818.png" alt="mark"></p>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201218/090905068.png" alt="mark"></p>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201218/091037603.png" alt="mark"></p>
<h4 id="1-更新仓库版本内核"><a href="#1-更新仓库版本内核" class="headerlink" title="1. 更新仓库版本内核"></a>1. 更新仓库版本内核</h4><ol>
<li><code>yum install epel-release</code>  具有较新软件版本的仓库</li>
<li><code>yum install kernel</code>   更新仓库中的版本内核</li>
</ol>
<h3 id="6-6-内核引导-grub"><a href="#6-6-内核引导-grub" class="headerlink" title="6.6 内核引导 (grub)"></a>6.6 内核引导 (grub)</h3><h4 id="1-修改引导内核"><a href="#1-修改引导内核" class="headerlink" title="1. 修改引导内核"></a>1. 修改引导内核</h4><p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201220/153624027.png" alt="mark"></p>
<ol>
<li><strong><code>grub2-editenv list</code> : 查看目前引导的内核</strong></li>
<li><code>grub2-set-default 数字</code> ： <strong>默认引导索引为下标数字的内核</strong><ul>
<li>同时可以使用<code>grub2-editenv list</code> : 查看目前引导的内核</li>
<li>通过<code>grep ^menu /boot/grub2/grub.cfg</code> 查看目前grub.cfg中可以引导的内核版本</li>
</ul>
</li>
</ol>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201220/154654510.png" alt="mark"></p>
<h4 id="2-忘记密码"><a href="#2-忘记密码" class="headerlink" title="2.  忘记密码"></a>2.  忘记密码</h4><ol>
<li><strong>进入启动界面 按下E键</strong></li>
</ol>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201220/155132727.png" alt="mark"></p>
<ol start="2">
<li><strong>找到图中显示的这一行配置</strong></li>
</ol>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201220/155247368.png" alt="mark"></p>
<ol start="3">
<li><strong>添加配置项</strong> <code>rd.break</code> ：之后按下<code>ctrl + x</code> 启动</li>
</ol>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201220/155325985.png" alt="mark"></p>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201220/155415968.png" alt="mark"></p>
<ol start="4">
<li><code>mount -o remount,rw</code> :  从虚拟内存上把root挂载到硬盘上<ul>
<li>重新挂载root目录 : <code>chroot /sysroot</code></li>
</ul>
</li>
</ol>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201220/155613984.png" alt="mark"></p>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201220/155704512.png" alt="mark"></p>
<ol start="5">
<li><strong>标准输入</strong> ： <code>echo 密码 | passwd --stdin root</code></li>
</ol>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201220/155853766.png" alt="mark"></p>
<p><strong>以上就是重新设置好了root的密码</strong></p>
<p><strong>注意 ： SELinux问题</strong></p>
<ul>
<li><strong>SELinux 会强制校验导致无法正常登陆系统</strong></li>
<li><strong>关闭 SELinux :</strong> <ul>
<li><code>vim /etc/selinux/config</code></li>
<li><strong>改为disabled</strong></li>
</ul>
</li>
<li><strong>最后exit 后 reboot重启系统</strong></li>
</ul>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201220/160113863.png" alt="mark"></p>
<h2 id="7-进程管理"><a href="#7-进程管理" class="headerlink" title="7. 进程管理"></a>7. 进程管理</h2><p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201220/160401657.png" alt="mark"></p>
<h3 id="7-1-进程的概念"><a href="#7-1-进程的概念" class="headerlink" title="7.1 进程的概念"></a>7.1 进程的概念</h3><p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201220/164457038.png" alt="mark"></p>
<h3 id="7-2-进程的查看"><a href="#7-2-进程的查看" class="headerlink" title="7.2 进程的查看"></a>7.2 进程的查看</h3><p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201220/164534139.png" alt="mark"></p>
<h4 id="1-ps"><a href="#1-ps" class="headerlink" title="1. ps"></a>1. ps</h4><ul>
<li><code>Linux ps （英文全拼：process status）</code>命令用于显示当前进程的状态，类似于 windows 的任务管理器。</li>
</ul>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ps [options] [--help]</span><br></pre></td></tr></table></figure>

<p><strong>参数</strong>：</p>
<p><strong>ps 的参数非常多, 在此仅列出几个常用的参数并大略介绍含义</strong></p>
<ul>
<li><strong>-A 列出所有的进程</strong></li>
<li><strong>-e : <code>-e</code>和<code>-A</code>的意思是一样的，即显示有关其他用户进程的信息，包括那些没有控制终端的进程。</strong></li>
<li><strong>-ef : <code>-f</code>显示用户id，进程id，父进程id，最近CPU使用情况，进程开始时间等等</strong></li>
<li><strong>-eLf : 打印进程信息和其中的线程信息</strong></li>
</ul>
<ol>
<li><strong>分页查看进程</strong></li>
</ol>
<p><code>ps -e | more</code></p>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201220/165022605.png" alt="mark"></p>
<ol start="2">
<li><strong>常用</strong> <code>ps -ef</code> : <strong>显示所有进程信息，连同命令行</strong></li>
</ol>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201220/165513971.png" alt="mark"></p>
<ol start="3">
<li><strong><code>ps -eLf</code> ：打印进程和其中线程的信息</strong></li>
</ol>
<h4 id="2-pstree"><a href="#2-pstree" class="headerlink" title="2. pstree"></a>2. pstree</h4><ul>
<li><strong>打印父子进程的树状形式</strong></li>
</ul>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201220/165750769.png" alt="mark"></p>
<h4 id="3-top"><a href="#3-top" class="headerlink" title="3. top"></a>3. top</h4><ul>
<li><strong>Linux top命令用于实时显示 process 的动态。</strong></li>
<li><strong>使用权限：所有使用者。</strong></li>
</ul>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201220/170002906.png" alt="mark"></p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">top [-] [d delay] [q] [c] [S] [s] [i] [n] [b]</span><br></pre></td></tr></table></figure>

<p><strong>参数说明</strong>：</p>
<ul>
<li><strong>d : 改变显示的更新速度，或是在交谈式指令列( interactive command)按 s</strong></li>
<li>q : 没有任何延迟的显示速度，如果使用者是有 superuser 的权限，则 top 将会以最高的优先序执行</li>
<li><strong>c : 切换显示模式，共有两种模式，一是只显示执行档的名称，另一种是显示完整的路径与名称</strong></li>
<li>S : 累积模式，会将己完成或消失的子行程 ( dead child process ) 的 CPU time 累积起来</li>
<li>s : 安全模式，将交谈式指令取消, 避免潜在的危机</li>
<li>i : 不显示任何闲置 (idle) 或无用 (zombie) 的行程</li>
<li><strong>n : 更新的次数，完成后将会退出 top</strong></li>
<li>b : 批次档模式，搭配 “n” 参数一起使用，可以用来将 top 的结果输出到档案内</li>
<li><strong>p : 显示指定的进程信息</strong></li>
</ul>
<p><strong>举例子</strong></p>
<ol>
<li><strong>显示指定的进程信息</strong></li>
</ol>
<figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># top -p 139</span></span><br><span class="line"></span><br><span class="line">//显示进程号为139的进程信息，CPU、内存占用率等</span><br></pre></td></tr></table></figure>



<h3 id="7-3-进程的控制"><a href="#7-3-进程的控制" class="headerlink" title="7.3 进程的控制"></a>7.3 进程的控制</h3><p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201220/171009156.png" alt="mark"></p>
<h4 id="1-优先级（nice-renice）"><a href="#1-优先级（nice-renice）" class="headerlink" title="1. 优先级（nice/renice）"></a>1. 优先级（nice/renice）</h4><ul>
<li>设置优先级 <code>nice -n 优先级（默认是0） 需要执行的文件</code></li>
</ul>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201220/190148121.png" alt="mark"></p>
<ul>
<li>调整<code>nice</code> 值   : <code>renice -n 15 进程号</code> </li>
</ul>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201220/190303728.png" alt="mark"></p>
<h4 id="2-后台前台运行切换-jobs"><a href="#2-后台前台运行切换-jobs" class="headerlink" title="2. 后台前台运行切换 (jobs)"></a>2. 后台前台运行切换 (jobs)</h4><ol>
<li>*<em>后台运行程序 *</em>  <code>shift + 7：&amp;</code></li>
</ol>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201220/190509882.png" alt="mark"> </p>
<ol start="2">
<li><strong>调回到前台</strong> <code>jobs</code></li>
</ol>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201220/190620959.png" alt="mark"></p>
<ul>
<li><code>jobs</code>   : 查看后台进程</li>
<li><code>fg 索引号</code> : 调回到前台运行</li>
<li><code>bg 索引号</code>  ： 后台运行</li>
</ul>
<ol start="3">
<li><strong>前台再放回到后台挂起</strong><ul>
<li><code>ctrl + z</code></li>
</ul>
</li>
</ol>
<ul>
<li><strong>这里再次top 进程号</strong></li>
</ul>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201220/190811386.png" alt="mark"></p>
<ul>
<li><strong>可以发现进程还在后台 只不过是挂起状态</strong></li>
</ul>
<ol start="4">
<li><strong>后台挂起恢复运行</strong><ul>
<li><strong>同上第2点</strong></li>
</ul>
</li>
</ol>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201220/190928000.png" alt="mark"></p>
<h3 id="7-4-进程通信（信号）"><a href="#7-4-进程通信（信号）" class="headerlink" title="7.4 进程通信（信号）"></a>7.4 进程通信（信号）</h3><p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201220/191302007.png" alt="mark"></p>
<ul>
<li><p><code>Linux kill</code> 命令用于删除执行中的程序或工作。</p>
</li>
<li><p><code>kill</code> 可将指定的信息送至程序。<strong>预设的信息为 SIGTERM(15)，可将指定程序终止。</strong></p>
</li>
<li><p><strong>若仍无法终止该程序，可使用 SIGKILL(9) 信息尝试强制删除程序</strong>。</p>
</li>
<li><p><strong>程序或工作的编号可利用 ps 指令或 jobs 指令查看。</strong></p>
</li>
</ul>
<ol>
<li><code>kill -l</code> ： 查看所有支持的信号</li>
</ol>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201220/191522247.png" alt="mark"></p>
<ol start="2">
<li><code>ctrl + c = SIGINT</code>  : <strong>2号信号</strong></li>
<li><code>kill -9 进程号</code>        ： <strong>9号信号</strong></li>
</ol>
<h3 id="7-5-守护进程"><a href="#7-5-守护进程" class="headerlink" title="7.5 守护进程"></a>7.5 守护进程</h3><p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201220/191917915.png" alt="mark"></p>
<ul>
<li>守护进程不需要自己启动</li>
<li>守护进程占用的目录是根目录</li>
<li>输出到指定的日志文件中</li>
</ul>
<h4 id="1-nohup（这个不是守护进程）"><a href="#1-nohup（这个不是守护进程）" class="headerlink" title="1. nohup（这个不是守护进程）"></a>1. nohup（这个不是守护进程）</h4><ul>
<li><p><strong>nohup</strong> 英文全称 <code>no hang up</code>（不挂起），用于在系统后台不挂断地运行命令，退出终端不会影响程序的运行。</p>
</li>
<li><p><strong>nohup</strong> 命令，在默认情况下（非重定向时），<strong>会输出一个名叫 nohup.out 的文件到当前目录下，如果当前目录的 nohup.out 文件不可写，输出重定向到 $HOME/nohup.out 文件中</strong></p>
</li>
</ul>
<p><strong>作用 ： 不响应挂起的信号</strong></p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">nohup Command [ Arg … ] [　&amp; ]</span><br></pre></td></tr></table></figure>

<p><strong>参数说明：</strong></p>
<p><strong>Command</strong>：要执行的命令。</p>
<p><strong>Arg</strong>：一些参数，可以指定输出文件。</p>
<p><strong>&amp;</strong>：让命令在后台执行，终端退出后命令仍旧执行。</p>
<p><strong>举个例子</strong></p>
<ol>
<li><code>nohup tail -f /var/log/messaages &amp;</code></li>
</ol>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201220/193227232.png" alt="mark"></p>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201220/193334292.png" alt="mark"></p>
<ol start="2">
<li><p><strong>本进程打印的内容 都 存到当前目录的 <code>nohup.out</code> 文件中</strong>    </p>
</li>
<li><p><strong>关闭当前shell , 可以看到的是: 之前nohup的进程的父进程变成了1号进程（孤儿进程）</strong></p>
</li>
</ol>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201220/193430954.png" alt="mark"></p>
<p><strong>注意 ：上述 tail 进程和 守护进程的区别</strong></p>
<ul>
<li><strong>输出文件的不同</strong></li>
<li>挂载的目录不同</li>
<li>但都是由1号进程收留</li>
</ul>
<p><strong>nohup 进程输出目录 ： tail 进程举例</strong></p>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201220/194205058.png" alt="mark"></p>
<p><strong>守护进程输出目录：sshd进程举例</strong></p>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201220/194433243.png" alt="mark"></p>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201220/194829190.png" alt="mark"></p>
<h4 id="2-screen-第三方工具"><a href="#2-screen-第三方工具" class="headerlink" title="2. screen (第三方工具)"></a>2. screen (第三方工具)</h4><p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201223/171115754.png" alt="mark"></p>
<ul>
<li><code>Linux screen</code>命令用于多重视窗管理程序。</li>
<li><code>screen</code>为多重视窗管理程序。此处所谓的视窗，是指一个全屏幕的文字模式画面。通常只有在使用telnet登入主机或是使用老式的终端机时，才有可能用到screen程序。</li>
<li><strong>作用 ： 在进行终端操作的时候，先进入screen 环境中 ，即使网络断开了，下次登录还可以恢复工作现场，并且程序还在执行。（规避网络中断）</strong></li>
</ul>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">screen [-AmRvx -ls -wipe][-d &lt;作业名称&gt;][-h &lt;行数&gt;][-r &lt;作业名称&gt;][-s &lt;shell&gt;][-S &lt;作业名称&gt;]</span><br></pre></td></tr></table></figure>

<p><strong>参数说明</strong>：</p>
<ul>
<li>-A 　将所有的视窗都调整为目前终端机的大小。</li>
<li>-d&lt;作业名称&gt; 　将指定的screen作业离线。</li>
<li>-h&lt;行数&gt; 　指定视窗的缓冲区行数。</li>
<li>-m 　即使目前已在作业中的screen作业，仍强制建立新的screen作业。</li>
<li>-r&lt;作业名称&gt; 　恢复离线的screen作业。</li>
<li><strong>-R/r 　先试图恢复离线的作业。若找不到离线的作业，即建立新的screen作业。</strong></li>
<li>-s<shell> 　指定建立新视窗时，所要执行的shell。</li>
<li>-S&lt;作业名称&gt; 　指定screen作业的名称。</li>
<li>-v 　显示版本信息。</li>
<li><strong>-x 　恢复之前离线的screen作业。</strong></li>
<li><strong>-ls或–list 　显示目前所有的screen作业。</strong></li>
<li>-wipe 　检查目前所有的screen作业，并删除已经无法使用的screen作业。</li>
</ul>
<p><strong>退出Screen</strong> </p>
<ul>
<li><code>ctrl + a + d</code></li>
</ul>
<p><strong>举例子</strong></p>
<ol>
<li><strong>安装screen</strong><ul>
<li><code>yum install screen</code></li>
</ul>
</li>
</ol>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201223/171244216.png" alt="mark"></p>
<ol start="2">
<li>运行 <code>tail -f /var/log/messages</code></li>
<li>退出 <code>ctrl + a + d</code></li>
</ol>
<ol start="4">
<li><strong>恢复screen</strong><ul>
<li>首先查看screen 列表 <code>screen -ls</code></li>
<li>通过 <code>screen -r + 序号</code> 恢复</li>
</ul>
</li>
</ol>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201226/111414088.png" alt="mark"></p>
<ol start="5">
<li><strong>取消当前screen:</strong> <code>exit</code></li>
</ol>
<h4 id="3-守护进程日志文件"><a href="#3-守护进程日志文件" class="headerlink" title="3. 守护进程日志文件"></a>3. 守护进程日志文件</h4><ol>
<li><strong>系统日志位置</strong> <code>/var/log</code></li>
</ol>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201226/113136981.png" alt="mark"></p>
<p><strong>需要注意的日志文件</strong></p>
<ul>
<li><p>常规系统日志文件 ： <code>/var/log/messages</code></p>
</li>
<li><p>内核相关日志信息 ： <code>/var/log/dmesg</code></p>
</li>
<li><p>系统安全日志 ： <code>/var/log/secure</code></p>
</li>
<li><p>周期性计划任务日志 ： <code>/var/log/cron</code></p>
</li>
</ul>
<h3 id="7-6-systemctl-服务管理工具"><a href="#7-6-systemctl-服务管理工具" class="headerlink" title="7.6 systemctl (服务管理工具)"></a>7.6 systemctl (服务管理工具)</h3><p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201226/142251028.png" alt="mark"></p>
<ul>
<li><code>systemctl</code> 是 <code>service</code> 的升级版本</li>
<li><code>systemctl</code>启动脚本 比 <code>service</code>启动脚本复杂，但同时更容易进行管理</li>
</ul>
<h4 id="1-service"><a href="#1-service" class="headerlink" title="1. service"></a>1. service</h4><p><strong>举例对比</strong></p>
<ol>
<li><strong>service 启动脚本</strong></li>
</ol>
<ul>
<li><code>network service</code> 脚本存放位置 <code>/etc/init.d</code></li>
<li><code>vim network</code></li>
</ul>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201226/142655206.png" alt="mark"></p>
<ol start="2">
<li><code>systemctl 启动脚本</code></li>
</ol>
<ul>
<li><p><code>sshd service</code> 脚本存放位置<code>/usr/lib/systemd/system/</code></p>
</li>
<li><p><code>vim sshd.service</code></p>
</li>
</ul>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201226/142934551.png" alt="mark"></p>
<ol start="3">
<li><strong>service : 启动级别</strong><ul>
<li><code>chkconfig --list</code></li>
<li><strong><code>init</code> 无法被 kill -9 杀掉</strong> ,所以如下几种级别可以实现</li>
</ul>
</li>
</ol>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201226/143428167.png" alt="mark"></p>
<ul>
<li><p><code>init 0</code> : 关机</p>
</li>
<li><p><code>init 6: 重启</code></p>
</li>
<li><p><code>init 1</code> : 单用户 （重置密码用）</p>
</li>
<li><p><code>init 2</code> : 不带网络的多用户模式</p>
</li>
<li><p><code>init 3</code> : 字符模式</p>
</li>
<li><p><code>init 5</code> : 图形模式</p>
</li>
<li><p><code>init 4</code> ： 未使用</p>
</li>
</ul>
<h4 id="2-systemctl"><a href="#2-systemctl" class="headerlink" title="2. systemctl"></a>2. systemctl</h4><p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201226/144222848.png" alt="mark"></p>
<p><strong>举个例子 ： 重启sshd.service 服务</strong></p>
<ul>
<li><code>systemctl restart sshd.service</code></li>
<li><code>systemctl status sshd.service</code></li>
</ul>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201226/144600025.png" alt="mark"></p>
<ol>
<li><strong>关于 enable 和 disable</strong> </li>
</ol>
<ul>
<li>随开机一起启动 关闭</li>
</ul>
<ol start="2">
<li><strong>systemctl : 服务级别问题</strong></li>
</ol>
<ul>
<li>存放位置 ： <code>/lib/systemd/system</code></li>
<li><code>ls *.target</code> ： 对应的符号链接</li>
<li><code>ls -ld runlevel*.target</code></li>
</ul>
<figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">[root@zhuuu system]<span class="comment"># ls -ld runlevel*.target</span></span><br><span class="line">lrwxrwxrwx 1 root root 15 Sep  2 14:22 runlevel0.target -&gt; poweroff.target</span><br><span class="line">lrwxrwxrwx 1 root root 13 Sep  2 14:22 runlevel1.target -&gt; rescue.target</span><br><span class="line">lrwxrwxrwx 1 root root 17 Sep  2 14:22 runlevel2.target -&gt; multi-user.target</span><br><span class="line">lrwxrwxrwx 1 root root 17 Sep  2 14:22 runlevel3.target -&gt; multi-user.target</span><br><span class="line">lrwxrwxrwx 1 root root 17 Sep  2 14:22 runlevel4.target -&gt; multi-user.target</span><br><span class="line">lrwxrwxrwx 1 root root 16 Sep  2 14:22 runlevel5.target -&gt; graphical.target</span><br><span class="line">lrwxrwxrwx 1 root root 13 Sep  2 14:22 runlevel6.target -&gt; reboot.target</span><br></pre></td></tr></table></figure>



<ol start="3">
<li><strong>当前服务所在的级别</strong></li>
</ol>
<ul>
<li><code>systemlctl get-default</code> : 查看当前服务所在级别</li>
</ul>
<figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">[root@zhuuu system]<span class="comment"># systemctl get-default</span></span><br><span class="line">multi-user.target</span><br></pre></td></tr></table></figure>

<ul>
<li><code>systemlctl set-default</code> ： 设置下次默认启动服务所在级别</li>
</ul>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201226/145733063.png" alt="mark"></p>
<ol start="4">
<li><strong>安排服务启动的顺序</strong></li>
</ol>
<p><strong>举个例子</strong></p>
<ul>
<li><p><code>sshd service</code> 脚本存放位置<code>/usr/lib/systemd/system/</code></p>
</li>
<li><p><code>vim sshd.service</code></p>
</li>
</ul>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201226/145917320.png" alt="mark"></p>
<ol>
<li><strong>新增Requires = xxx.service</strong></li>
<li><strong>在 After中添加  新的xxx.service</strong></li>
</ol>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201226/150046114.png" alt="mark"></p>
<h3 id="7-7-SELinux-（安全组件）"><a href="#7-7-SELinux-（安全组件）" class="headerlink" title="7.7 SELinux （安全组件）"></a>7.7 SELinux （安全组件）</h3><p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201226/150307430.png" alt="mark"></p>
<ul>
<li><strong>自主访问控制</strong> ：通过用户权限进行控制</li>
<li><strong>强制访问控制</strong> ：给<strong>用户 进程 文件 打标签</strong>，三个标签如果对得上就可以访问系统 控制文件</li>
</ul>
<p><strong>注意 ：</strong> </p>
<ul>
<li><strong>一般生产环境中 SELinux 是关闭的</strong></li>
<li>因为 SELinux 是会影响系统性能的</li>
</ul>
<p><strong>三种状态</strong></p>
<ul>
<li>enforcing</li>
<li>permissive</li>
<li>disabled</li>
</ul>
<ol>
<li><strong>设置Selinux 运行状态</strong><ul>
<li><code>vim /etc/selinux/config</code></li>
</ul>
</li>
</ol>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201226/150856148.png" alt="mark"></p>
<ol start="2">
<li><strong>从enforcing 临时变为 permissive</strong> <ul>
<li><code>setenforce 0</code></li>
</ul>
</li>
</ol>
<ol start="3">
<li><strong>查看标签</strong></li>
</ol>
<ul>
<li><strong><code>ps -Z</code> :   查看进程标签</strong></li>
</ul>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201226/151256341.png" alt="mark"></p>
<ul>
<li><strong><code>id -Z</code> ： 查看用户标签</strong></li>
</ul>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201226/151330943.png" alt="mark"></p>
<ul>
<li><strong><code>ls -Z</code> :  查看文件标识</strong></li>
</ul>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201226/151359325.png" alt="mark"></p>
<h2 id="8-内存和磁盘管理"><a href="#8-内存和磁盘管理" class="headerlink" title="8. 内存和磁盘管理"></a>8. 内存和磁盘管理</h2><p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201226/161854057.png" alt="mark"></p>
<ul>
<li><strong>本章节有以下内容</strong><ul>
<li><strong>内存和磁盘使用率的查看</strong></li>
<li><strong>ext4 文件系统 （centos 7 之后是xfs）</strong></li>
<li>磁盘配额的使用</li>
<li>磁盘的分区和挂载</li>
<li>交换分区的查看和创建</li>
<li>软件<code>RAID</code>的使用</li>
<li>逻辑卷管理</li>
<li>系统综合状态查看</li>
</ul>
</li>
</ul>
<h3 id="8-1-内存和磁盘使用率查看"><a href="#8-1-内存和磁盘使用率查看" class="headerlink" title="8.1 内存和磁盘使用率查看"></a>8.1 内存和磁盘使用率查看</h3><ol>
<li><strong>内存使用率</strong></li>
</ol>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201226/162429689.png" alt="mark"></p>
<ol start="2">
<li><strong>磁盘使用率</strong></li>
</ol>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201226/162456321.png" alt="mark"></p>
<h4 id="1-free"><a href="#1-free" class="headerlink" title="1. free"></a>1. free</h4><ul>
<li><p><code>Linux free</code>命令用于显示内存状态。</p>
</li>
<li><p><code>free</code>指令会显示内存的使用情况，包括实体内存，虚拟的交换文件内存，共享内存区段，以及系统核心使用的缓冲区等。</p>
</li>
</ul>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">free [-bkmotV][-s &lt;间隔秒数&gt;]</span><br></pre></td></tr></table></figure>

<p><strong>参数说明</strong>：</p>
<ul>
<li><p><code>-b</code>　以Byte为单位显示内存使用情况。</p>
</li>
<li><p><code>-k</code>　以KB为单位显示内存使用情况。</p>
</li>
<li><p><code>-m</code> 　以MB为单位显示内存使用情况。</p>
</li>
<li><p><code>-g</code>     以 GB为单位显示内容使用情况</p>
</li>
</ul>
<ul>
<li>-o 　不显示缓冲区调节列。</li>
<li>-s&lt;间隔秒数&gt; 　持续观察内存使用状况。</li>
<li>-t 　显示内存总和列。</li>
<li>-V 　显示版本信息。</li>
</ul>
<p><strong>注意 ：</strong> </p>
<ul>
<li><strong>如果要显示以某个单位的内存情况 ，使用下一级单位防止被向下取整</strong></li>
</ul>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201226/163309101.png" alt="mark"></p>
<ul>
<li><strong>swap 对冲区 ：</strong> 当内存不够用的时候，可以将磁盘上空间先拿来顶用（最好不要swap）<ul>
<li><strong>Linux 机制 ： 如果内存不够用 同时没有swap 的时候，内核会随机杀掉占用内存大的进程</strong></li>
</ul>
</li>
</ul>
<h4 id="2-top"><a href="#2-top" class="headerlink" title="2. top"></a>2. top</h4><ul>
<li><strong>也可以动态的查看内存使用</strong></li>
</ul>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201226/163733755.png" alt="mark"></p>
<h4 id="3-fdisk"><a href="#3-fdisk" class="headerlink" title="3. fdisk"></a>3. fdisk</h4><ul>
<li><code>Linux fdisk</code>是一个<strong>创建和维护分区表的程序</strong>，它兼容DOS类型的分区表、BSD或者SUN类型的磁盘列表。</li>
<li><strong>既可以分区 又可以查看磁盘（尽量生产环境不要用）</strong></li>
</ul>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201226/163941096.png" alt="mark"></p>
<p><strong>磁盘分类 : b 块设备</strong></p>
<ul>
<li>可插拔磁盘 <code>/dev/sda    /dev/sdb   .....</code></li>
<li>云主机磁盘 <code>/dev/vda</code></li>
</ul>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201226/164100633.png" alt="mark"></p>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201226/164450577.png" alt="mark"></p>
<ul>
<li>主设备号表示 ： 磁盘使用的是什么驱动程序</li>
<li>从设备号表示 ： 访问的地址</li>
</ul>
<p><strong>举个例子</strong></p>
<ul>
<li><code>fdisk -l</code> ： 查看磁盘使用情况</li>
</ul>
<img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201226/165116341.png" alt="mark" style="zoom:80%;" />



<h4 id="4-parted-l（功能更完善）"><a href="#4-parted-l（功能更完善）" class="headerlink" title="4. parted -l（功能更完善）"></a>4. parted -l（功能更完善）</h4><ul>
<li><strong>作用同 <code>fdisk -l</code></strong></li>
<li><strong>作用比 fdisk 更为完善</strong></li>
</ul>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201226/165334497.png" alt="mark"></p>
<h4 id="5-df"><a href="#5-df" class="headerlink" title="5. df"></a>5. df</h4><ul>
<li><code>Linux df</code>（英文全拼：<code>disk free</code>） 命令用于显示目前在 Linux 系统上的文件系统磁盘使用情况统计。</li>
</ul>
<p><strong>举个例子</strong></p>
<ol>
<li><strong>-h选项</strong>，通过它可以产生<strong>可读的格式df命令</strong>的输出：</li>
</ol>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"># df -h </span><br><span class="line">Filesystem      Size  Used   Avail Use% Mounted on </span><br><span class="line">&#x2F;dev&#x2F;sda6       29G   4.2G   23G   16%     &#x2F; </span><br><span class="line">udev            1.5G  4.0K   1.5G   1%     &#x2F;dev </span><br><span class="line">tmpfs           604M  892K   603M   1%     &#x2F;run </span><br><span class="line">none            5.0M     0   5.0M   0%     &#x2F;run&#x2F;lock </span><br><span class="line">none            1.5G  156K   1.5G   1%     &#x2F;run&#x2F;shm</span><br></pre></td></tr></table></figure>

<p>我们可以看到输出显示的数字形式的’G’（千兆字节），”M”（兆字节）和”K”（千字节）。</p>
<p>这使输出容易阅读和理解，从而使显示可读的。请注意，第二列的名称也发生了变化，为了使显示可读的”大小”。</p>
<ol start="2">
<li><strong>显示文件系统的磁盘使用情况统计</strong></li>
</ol>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"># df </span><br><span class="line">Filesystem     1K-blocks    Used     Available Use% Mounted on </span><br><span class="line">&#x2F;dev&#x2F;sda6       29640780 4320704     23814388  16%     &#x2F; </span><br><span class="line">udev             1536756       4     1536752    1%     &#x2F;dev </span><br><span class="line">tmpfs             617620     888     616732     1%     &#x2F;run </span><br><span class="line">none                5120       0     5120       0%     &#x2F;run&#x2F;lock </span><br><span class="line">none             1544044     156     1543888    1%     &#x2F;run&#x2F;shm</span><br></pre></td></tr></table></figure>

<ul>
<li><p><strong>第一列</strong>指定文件系统的名称，</p>
</li>
<li><p><strong>第二列</strong>指定一个特定的文件系统1K-块1K是1024字节为单位的总内存。用和可用列正在使用中，分别指定的内存量。</p>
</li>
<li><p>使用列指定使用的内存的百分比，而最后一栏”安装在”指定的文件系统的挂载点。</p>
</li>
</ul>
<h4 id="6-du"><a href="#6-du" class="headerlink" title="6. du"></a>6. du</h4><ul>
<li><strong>Linux du （英文全拼：disk usage）命令用于显示目录或文件的大小。</strong></li>
<li><strong>du 会显示指定的目录或文件所占用的磁盘空间。</strong></li>
</ul>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">du [-abcDhHklmsSx][-L &lt;符号连接&gt;][-X &lt;文件&gt;][--block-size][--exclude&#x3D;&lt;目录或文件&gt;][--max-depth&#x3D;&lt;目录层数&gt;][--help][--version][目录或文件]</span><br></pre></td></tr></table></figure>

<p><strong>参数说明</strong>：</p>
<ul>
<li>-a或-all 显示目录中个别文件的大小。</li>
<li>-b或-bytes 显示目录或文件大小时，以byte为单位。</li>
<li>-c或–total 除了显示个别目录或文件的大小外，同时也显示所有目录或文件的总和。</li>
<li>-D或–dereference-args 显示指定符号连接的源文件大小。</li>
<li>-h或–human-readable 以K，M，G为单位，提高信息的可读性。</li>
<li>-H或–si 与-h参数相同，但是K，M，G是以1000为换算单位。</li>
<li>-k或–kilobytes 以1024 bytes为单位。</li>
<li>-l或–count-links 重复计算硬件连接的文件。</li>
<li>-L&lt;符号连接&gt;或–dereference&lt;符号连接&gt; 显示选项中所指定符号连接的源文件大小。</li>
<li>-m或–megabytes 以1MB为单位。</li>
<li>-s或–summarize 仅显示总计。</li>
<li>-S或–separate-dirs 显示个别目录的大小时，并不含其子目录的大小。</li>
<li>-x或–one-file-xystem 以一开始处理时的文件系统为准，若遇上其它不同的文件系统目录则略过。</li>
<li>-X&lt;文件&gt;或–exclude-from=&lt;文件&gt; 在&lt;文件&gt;指定目录或文件。</li>
<li>–exclude=&lt;目录或文件&gt; 略过指定的目录或文件。</li>
<li>–max-depth=&lt;目录层数&gt; 超过指定层数的目录后，予以忽略。</li>
<li>–help 显示帮助。</li>
<li>–version 显示版本信息。</li>
</ul>
<p><strong>注意 ： du 和 ls 查出来文件大小的区别</strong></p>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201226/170327254.png" alt="mark"></p>
<p><strong>根本原因 ： 文件存在空洞( 比如 创建30G的虚拟机 真正占用大小只有10G)</strong></p>
<hr>
<p><strong>空洞文件举例</strong></p>
<ol>
<li>创建<strong>普通文件</strong> : <code>dd if=输入文件 bs=4M count=10 of=输出文件</code>  (<code>bs count</code> 都是参数 )<ul>
<li>bs 表示块大小</li>
<li>count 表示写入几次</li>
<li>这里使用 ：<code>dd if=/dev/zero bs=4M count=10 of=afile</code></li>
</ul>
</li>
</ol>
<img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201226/171923788.png" alt="mark" style="zoom:60%;" />



<ol start="2">
<li><strong>分别查看 du ls 大小</strong></li>
</ol>
<ul>
<li><code>du -h afile</code></li>
<li><code>ls -lh afile</code></li>
</ul>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201226/172121959.png" alt="mark"></p>
<ol start="3">
<li><strong>创建空洞文件</strong><ul>
<li><code>dd if=/dev/zero bs=4M count=10 seek=20 of=bfile</code></li>
<li><strong>seek = 20 说明跳过20个块 就是写40M然后跳过80M</strong></li>
</ul>
</li>
</ol>
<ol start="4">
<li><strong>分别查看 du ls 大小</strong><ul>
<li><code>du -h bfile</code></li>
<li><code>ls -lh bfile</code></li>
</ul>
</li>
</ol>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201226/172534219.png" alt="mark"></p>
<p><strong>小结：ls 和 du 统计的大小是不一样的</strong></p>
<ul>
<li><strong>du 统计的是文件的实际大小</strong></li>
<li><strong>ls   统计的是文件的大小</strong></li>
</ul>
<h3 id="8-2-常见的文件系统"><a href="#8-2-常见的文件系统" class="headerlink" title="8.2 常见的文件系统"></a>8.2 常见的文件系统</h3><p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201226/173653286.png" alt="mark"></p>
<ul>
<li><p><strong>插入的硬盘不是立即可以使用的，必须通过某个文件系统对文件进行管理，才能进行文件读写</strong></p>
</li>
<li><p><strong>常见的系统</strong></p>
<ul>
<li><strong>ext4</strong></li>
<li><strong>xfs</strong></li>
<li><strong>NTFS(Windows常用,Linux需要安装插件)</strong></li>
</ul>
</li>
</ul>
<h4 id="1-ext4-文件系统"><a href="#1-ext4-文件系统" class="headerlink" title="1. ext4 文件系统"></a>1. ext4 文件系统</h4><p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201226/173949345.png" alt="mark"></p>
<ul>
<li><p><strong>超级块 ： 记录了包含了多少个文件（文件总数 ,df 查的就是这个）</strong></p>
</li>
<li><p><strong>超级块副本：保证超级块的还原</strong></p>
</li>
<li><p><strong>i 节点 ： 记录每一个文件大小 ，文件名称，文件权限，文件编号</strong></p>
</li>
<li><p><strong>数据块 :  链接式的结构，找到i节点就可以找到数据块 （du 查的就是这个）</strong></p>
</li>
</ul>
<p><strong>i 节点示意图</strong></p>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201228/152025288.png" alt="mark"></p>
<p><strong>注意</strong></p>
<ol>
<li><p><strong><code>ls -i</code> 可以查看i 节点记录</strong></p>
</li>
<li><p><strong>文件名记录在了父目录的节点，而不是记录在自己这里</strong></p>
</li>
<li><p><strong>文件权限 ： 理解rwx</strong></p>
<ul>
<li><strong>对于普通文件来说 读权限是读数据块(Data Block)内容</strong></li>
<li><strong>对于目录文件来说 读权限是读取目录里的文件名称</strong></li>
</ul>
</li>
<li><p><strong>对于上述ls du差异的解读</strong></p>
<ul>
<li><strong>ls   查看的是i 节点里面的信息</strong></li>
<li><strong>du 查看的是真正数据块个数的信息</strong></li>
</ul>
</li>
</ol>
<h4 id="2-touch-cp-mv-vim-rm-本质"><a href="#2-touch-cp-mv-vim-rm-本质" class="headerlink" title="2. touch cp mv vim rm 本质"></a>2. touch cp mv vim rm 本质</h4><p><strong>touch</strong></p>
<ol>
<li><strong>默认存储最小的 数据块 大小是4K</strong></li>
</ol>
<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">[root@zhuuu ZhuuuTest]# touch afile</span><br><span class="line">[root@zhuuu ZhuuuTest]# ls -li afile </span><br><span class="line">794582 -rw-r--r--. 1 root root 0 Dec 28 15:46 afile</span><br><span class="line">[root@zhuuu ZhuuuTest]# echo 123 &gt; afile</span><br><span class="line">[root@zhuuu ZhuuuTest]# du -h afile </span><br><span class="line">4.0K	afile</span><br><span class="line">[root@zhuuu ZhuuuTest]# ls -li afile </span><br><span class="line">794582 -rw-r--r--. 1 root root 4 Dec 28 15:47 afile</span><br></pre></td></tr></table></figure>

<p><strong>注：</strong></p>
<ul>
<li><strong>当存储大量小文件 ，Linux是如何避免磁盘浪费的</strong></li>
</ul>
<p><strong>cp</strong></p>
<ol>
<li><strong>cp 本质是创建了新的文件，相当于是深拷贝（修改一个文件，另外一个文件不会有变化）</strong></li>
</ol>
<figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">[root@zhuuu ZhuuuTest]<span class="comment"># cp afile afile2</span></span><br><span class="line">[root@zhuuu ZhuuuTest]<span class="comment"># ls -li afile*</span></span><br><span class="line">794582 -rw-r--r--. 1 root root 4 Dec 28 15:47 afile</span><br><span class="line">794583 -rw-r--r--. 1 root root 4 Dec 28 15:52 afile2</span><br></pre></td></tr></table></figure>

<ol start="2">
<li>可以看到上面的是 一个文件 i 节点编号是794582 ，另外一个节点的编号是794583</li>
</ol>
<p><strong>mv</strong></p>
<ol>
<li><strong>mv 操作： 虽然mv操作后文件名称变了，但是文件的i 节点编号还是没变</strong></li>
</ol>
<figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">[root@zhuuu ZhuuuTest]<span class="comment"># mv afile2 afile3</span></span><br><span class="line">[root@zhuuu ZhuuuTest]<span class="comment"># ls -li afile*</span></span><br><span class="line">794582 -rw-r--r--. 1 root root 4 Dec 28 15:47 afile</span><br><span class="line">794583 -rw-r--r--. 1 root root 4 Dec 28 15:52 afile3</span><br></pre></td></tr></table></figure>

<ol start="2">
<li><strong>本质 ： 只是改了 目录里面 i节点的对应关系</strong></li>
</ol>
<p><strong>注：</strong></p>
<ul>
<li>如果mv 移动到其他的位置 ，那么目录 i节点 数据块都要发生变化</li>
<li>其他位置是指<ul>
<li>除当前文件系统的区域</li>
<li>新的分区</li>
</ul>
</li>
</ul>
<p><strong>vim</strong></p>
<ol>
<li><strong>vim 默认写入数据会改变 i 节点的信息</strong></li>
</ol>
<figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">[root@zhuuu ZhuuuTest]<span class="comment"># vim afile4</span></span><br><span class="line">[root@zhuuu ZhuuuTest]<span class="comment"># ls -li afile4</span></span><br><span class="line">794584 -rw-r--r--. 1 root root 11 Dec 28 15:59 afile4</span><br><span class="line">[root@zhuuu ZhuuuTest]<span class="comment"># vim afile4</span></span><br><span class="line">[root@zhuuu ZhuuuTest]<span class="comment"># ls -li afile4</span></span><br><span class="line">794586 -rw-r--r--. 1 root root 17 Dec 28 15:59 afile4</span><br></pre></td></tr></table></figure>

<ol start="2">
<li><strong>vim 编辑的文件会默认生成一个.swap文件</strong></li>
</ol>
<p><strong>rm</strong></p>
<ol>
<li><strong>本质 ： 让文件名和 i 节点的链接断开</strong></li>
<li>文件恢复的秘密 ： 因为rm 本质只是让链接断开<ul>
<li>此时可以立即断电，扫描磁盘中的i节点和数据块 进行数据恢复</li>
<li>断开链接的好处 ： 删除无论多大的文件，时间都是一样的</li>
</ul>
</li>
</ol>
<h4 id="3-符号链接和硬链接"><a href="#3-符号链接和硬链接" class="headerlink" title="3. 符号链接和硬链接"></a>3. 符号链接和硬链接</h4><p><strong>ln : 硬链接</strong></p>
<ol>
<li><code>ln</code> 命令可以恢复 rm 断开的 i 节点链接</li>
</ol>
<figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">[root@zhuuu ZhuuuTest]<span class="comment"># ln afile bfile</span></span><br><span class="line">[root@zhuuu ZhuuuTest]<span class="comment"># ls -li afile bfile </span></span><br><span class="line">794582 -rw-r--r--. 2 root root 4 Dec 28 15:47 afile</span><br><span class="line">794582 -rw-r--r--. 2 root root 4 Dec 28 15:47 bfile</span><br></pre></td></tr></table></figure>

<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20201228/161234097.png" alt="mark"></p>
<p>注：</p>
<ul>
<li><code>ln</code> 链接后的文件，链接的都是同一个文件，无论对哪个文件做改变，两个文件都会同时变化</li>
<li><code>ln</code>  的 link 是不能跨越文件系统的</li>
</ul>
<p><strong>软链接 ： 符号链接</strong></p>
<ol>
<li><p>使用的是<code>ln -s</code></p>
</li>
<li><p>符号链接并不是同一个文件， i 节点不同</p>
</li>
</ol>
<figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">[root@zhuuu ZhuuuTest]<span class="comment"># ln -s afile aafile</span></span><br><span class="line">[root@zhuuu ZhuuuTest]<span class="comment"># ls -li afile aafile </span></span><br><span class="line">794584 lrwxrwxrwx. 1 root root 5 Dec 28 16:15 aafile -&gt; afile</span><br><span class="line">794582 -rw-r--r--. 1 root root 4 Dec 28 15:47 afile</span><br></pre></td></tr></table></figure>

<ol start="3">
<li><p><strong>符号链接 : 记录的是文件的路径</strong></p>
</li>
<li><p><code>lrwxrwxrwx</code> 权限 前面的<code>l</code>表示是 符号链接</p>
</li>
<li><p>链接文件的权限是777权限，对链接文件的所有操作都是会执行对原本文件的操作</p>
</li>
</ol>
<figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">[root@zhuuu ZhuuuTest]<span class="comment"># chmod 776 aafile </span></span><br><span class="line">[root@zhuuu ZhuuuTest]<span class="comment"># ls -li afile aafile </span></span><br><span class="line">794584 lrwxrwxrwx. 1 root root 5 Dec 28 16:15 aafile -&gt; afile</span><br><span class="line">794582 -rwxrwxrw-. 1 root root 4 Dec 28 15:47 afile</span><br></pre></td></tr></table></figure>



<p><strong>注：</strong></p>
<ul>
<li><strong>符号链接可以跨不同的系统，跨不同的分区</strong></li>
<li><strong>符号链接和硬链接的区别</strong><ul>
<li>符号链接是要创建一个新的文件,记录的是文件的路径</li>
<li>硬链接只是修改了目录的i 节点信息</li>
</ul>
</li>
</ul>
<h4 id="4-facl-文件访问控制列表"><a href="#4-facl-文件访问控制列表" class="headerlink" title="4. facl (文件访问控制列表)"></a>4. facl (文件访问控制列表)</h4><ol>
<li>查看文件的访问控制列表</li>
</ol>
<figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">[root@zhuuu ZhuuuTest]<span class="comment"># getfacl afile</span></span><br><span class="line"><span class="comment"># file: afile</span></span><br><span class="line"><span class="comment"># owner: root</span></span><br><span class="line"><span class="comment"># group: root</span></span><br><span class="line">user::rwx</span><br><span class="line">group::rwx</span><br><span class="line">other::rw-</span><br><span class="line"></span><br><span class="line">[root@zhuuu ZhuuuTest]<span class="comment"># ls -li afile </span></span><br><span class="line">794582 -rwxrwxrw-. 1 root root 4 Dec 28 15:47 afile</span><br></pre></td></tr></table></figure>



<ol start="2">
<li>赋予特定用户权限</li>
</ol>
<figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">[root@zhuuu ZhuuuTest]<span class="comment"># useradd zhuuu</span></span><br><span class="line">[root@zhuuu ZhuuuTest]<span class="comment"># setfacl -m u:zhuuu:r afile</span></span><br><span class="line">[root@zhuuu ZhuuuTest]<span class="comment"># ls -l afile</span></span><br><span class="line">-rwxrwxrw-+ 1 root root 4 Dec 28 15:47 afile</span><br><span class="line">[root@zhuuu ZhuuuTest]<span class="comment"># getfacl afile</span></span><br><span class="line"><span class="comment"># file: afile</span></span><br><span class="line"><span class="comment"># owner: root</span></span><br><span class="line"><span class="comment"># group: root</span></span><br><span class="line">user::rwx</span><br><span class="line">user:zhuuu:r--</span><br><span class="line">group::rwx</span><br><span class="line">mask::rwx</span><br><span class="line">other::rw-</span><br></pre></td></tr></table></figure>



<p>注：</p>
<ul>
<li><code>setfacl -m u:zhuuu:rw afile</code> 赋予用户权限</li>
<li><code>setfacl -x g:group:r afile</code> 收回用户组权限</li>
<li><code>-rwxrwxrw-+</code> : + 说明使用了facl ，需使用<code>getfacl afile</code> 进行查看</li>
</ul>
<h4 id=""><a href="#" class="headerlink" title=""></a></h4><h3 id="8-3-分区和挂载"><a href="#8-3-分区和挂载" class="headerlink" title="8.3 分区和挂载"></a>8.3 分区和挂载</h3><p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20210104/110714324.png" alt="mark"></p>
<h4 id="1-进行分区"><a href="#1-进行分区" class="headerlink" title="1. 进行分区"></a>1. 进行分区</h4><ol>
<li><code>fdisk /dev/sdc(设备名)</code>  : 分区</li>
<li>获得分区帮助</li>
</ol>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20210104/111352891.png" alt="mark"></p>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20210104/111639209.png" alt="mark"></p>
<ol start="3">
<li><strong>新建分区 <code>n</code></strong><ul>
<li>主分区 ： 只能扩展4个</li>
<li>扩展分区 ： 多余4个分区</li>
<li>服务器一般都是一个主分区</li>
</ul>
</li>
<li><strong>创建一个50G的分区</strong><ul>
<li>p   创建主分区</li>
<li>p   打印分区情况</li>
<li>w  保存分区信息</li>
<li>q   不保存退出</li>
<li>d    删除当前分区信息</li>
</ul>
</li>
</ol>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20210104/111830784.png" alt="mark"></p>
<ol start="5">
<li><strong>成功保存</strong></li>
</ol>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20210104/112827158.png" alt="mark"></p>
<h4 id="2-使用分区（mkfs）"><a href="#2-使用分区（mkfs）" class="headerlink" title="2. 使用分区（mkfs）"></a>2. 使用分区（mkfs）</h4><ol>
<li><strong>首先根据文件系统去管理分区</strong></li>
</ol>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20210104/112939458.png" alt="mark"></p>
<ol start="2">
<li><code>mkfs.ext4 /dev/sdc1</code> :  mkfs.文件系统名 设备名</li>
</ol>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20210104/113115931.png" alt="mark"></p>
<ol start="3">
<li><strong>linux 一切皆文件 ： 对设备的操作需要挂载磁盘</strong><ul>
<li><strong>新建目录</strong> <code>mkdir /mnt/sdc1</code></li>
</ul>
</li>
<li><strong>自动检测文件系统挂载</strong> ： <code>mount -t auto(ext4) 需要挂载的设备 挂载的目录</code> </li>
</ol>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20210104/113335215.png" alt="mark"></p>
<p><strong>小结</strong></p>
<ol>
<li><strong>流程</strong></li>
</ol>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">流程 sdc(磁盘)-&gt;sdc1(分区)-&gt;ext4(文件系统)-&gt;mount(挂载)</span><br></pre></td></tr></table></figure>

<ol start="2">
<li><strong>挂载后 对目录的操作就是对设备的操作</strong></li>
</ol>
<p><strong>注意：</strong></p>
<ul>
<li><strong>如果硬盘大于2T</strong><ul>
<li><strong>需要使用<code>parted</code> 命令进行分区</strong></li>
<li><strong>不能使用fdisk</strong></li>
<li>使用方法 ：<code>parted 设备名</code></li>
</ul>
</li>
</ul>
<h4 id="3-mount-（挂载）"><a href="#3-mount-（挂载）" class="headerlink" title="3. mount （挂载）"></a>3. mount （挂载）</h4><ul>
<li><strong>mount 挂载是放在内存中临时保存的，重启之后就会消失掉</strong></li>
<li><strong>固化（开机自动挂载） ： 修改配置文件，开机自动进行挂载</strong><ul>
<li>位置存放 <code>vim /etc/fstab</code></li>
</ul>
</li>
</ul>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20210104/113718975.png" alt="mark"></p>
<ul>
<li><strong>填写方式</strong><ul>
<li>第一列 ： 设备名</li>
<li>第二列 ： 指定要挂载的目录</li>
<li>第三列 ： 使用的文件系统</li>
<li>第四列 ： （defaults） 给文件系统的权限 ： 默认可读可写</li>
<li>第五列，第六列 ： 0 0<ul>
<li>第一个 0 ：dump 硬盘备份 是否要去备份 （现在使用tar 进行备份）</li>
<li>第二个 0 ：非正常关机 进行磁盘自检（ext2 ext3）</li>
</ul>
</li>
</ul>
</li>
</ul>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20210104/113956637.png" alt="mark"></p>
<h3 id="8-4-用户磁盘配额"><a href="#8-4-用户磁盘配额" class="headerlink" title="8.4 用户磁盘配额"></a>8.4 用户磁盘配额</h3><h4 id="1-xfs-quota"><a href="#1-xfs-quota" class="headerlink" title="1. xfs_quota"></a>1. xfs_quota</h4><ul>
<li>用于限制用户/ 用户组使用磁盘的功能</li>
</ul>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20210105/094459772.png" alt="mark"></p>
<ol>
<li><strong>对分区进行格式化  （-f 强制格式化）</strong><code>mkfs.xfs</code>  </li>
<li><strong>创建挂载目录</strong><code>mkdir -p /mnt/disk1</code>   </li>
<li><strong>挂载设备到目录</strong><code>mount -o uquota,gquota /dev/sdb1 /mnt/disk1</code> <ul>
<li>同时支持磁盘配额 （uquota , gquota : 用户磁盘配额和用户组磁盘配额）</li>
</ul>
</li>
</ol>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20210105/094952814.png" alt="mark"></p>
<ol start="4">
<li><strong>修改权限</strong> ： <code>chomd 1777 /mnt/disk1</code> </li>
<li><strong>查看用户磁盘配额</strong> ： <code>xfs_quota -x -c &#39;report -ugibh /mnt/disk1&#39;</code> <ul>
<li><code>root</code>    用户不受限制，不要使用root用户查看磁盘配额</li>
<li><code>-ugibh</code> : <code>u:用户 g:用户组 i:i节点 b:块 h:可读</code></li>
</ul>
</li>
<li><strong>限制磁盘配额</strong> ： <code>xfs_quota -x -c &#39;limit -u isoft=5 ihard=10 user1&#39; /mnt/disk1</code><ul>
<li><code>isoft   :</code>软限制（i 节点）</li>
<li><code>ihard :</code>硬限制（i 节点）</li>
<li><code>bsoft  :</code>软限制（数据块）</li>
<li><code>bhard :</code>硬限制（数据块）</li>
</ul>
</li>
</ol>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20210105/095858052.png" alt="mark"></p>
<p><strong>小结</strong> </p>
<ul>
<li><strong>此后，用户1 <code>cd /mnt/disk1</code> 进入该磁盘的时候，会被限制用户磁盘配额</strong></li>
</ul>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20210105/100039400.png" alt="mark"></p>
<h3 id="8-5-交换分区-swap"><a href="#8-5-交换分区-swap" class="headerlink" title="8.5 交换分区 (swap)"></a>8.5 交换分区 (swap)</h3><ul>
<li><strong>作用  ：扩充分区两种方式</strong><ul>
<li>新的分区</li>
<li>用文件制作swap 分区</li>
</ul>
</li>
</ul>
<h4 id="1-分区方式扩充-swap"><a href="#1-分区方式扩充-swap" class="headerlink" title="1. 分区方式扩充 swap"></a>1. 分区方式扩充 swap</h4><ol>
<li>查看swap 目前状况 :  <code>free -m</code></li>
</ol>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20210105/100850306.png" alt="mark"></p>
<ol start="2">
<li><p>首先对硬盘进行分区 ： <code>fdisk 设备</code></p>
</li>
<li><p>进行swap格式化 ：<code>mkswap /dev/sdd1(分区)</code></p>
</li>
<li><p>swap 进行挂载  : <code>swapon /dev/sdd1(分区)</code></p>
</li>
<li><p>swap 进行卸载  : <code>swapoff /dev/sdd1(分区)</code></p>
</li>
</ol>
<p><strong>再次<code>free -m</code> 进行查看 ，发现swap已经被扩展了</strong></p>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20210105/101143775.png" alt="mark"></p>
<h4 id="2-文件方式扩充-swap"><a href="#2-文件方式扩充-swap" class="headerlink" title="2. 文件方式扩充 swap"></a>2. 文件方式扩充 swap</h4><ol>
<li>创造空洞文件 ：为了制造swap 的空间<ul>
<li><code>dd if=/dev/zero bs=4M count=1024 of=/swapfile</code></li>
</ul>
</li>
<li><strong>注意 ：一定要修改权限</strong> <code>chmod 600 /swapfile</code></li>
<li>swap 进行挂载  : <code>swapon /swapfile</code></li>
</ol>
<p><strong>注意：</strong></p>
<ul>
<li><strong>以上方式都是临时的</strong></li>
<li><strong>永久需要写入配置文件 ： vim /etc/fstab</strong></li>
<li><strong>写入时候发生问题</strong><ul>
<li><strong>没有把握 ： # 注释掉</strong></li>
<li><strong>写错重启失效 ： grub 进行单用户方式，修复<code>/etc/fstab</code></strong></li>
</ul>
</li>
</ul>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20210105/104508640.png" alt="mark"></p>
<h3 id="8-6-RAID"><a href="#8-6-RAID" class="headerlink" title="8.6 RAID"></a>8.6 RAID</h3><ul>
<li><strong>RAID : 磁盘阵列</strong></li>
</ul>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20210105/105342476.png" alt="mark"></p>
<ul>
<li><p><strong>RAID常见级别</strong></p>
<ul>
<li>RAID 0 ：   将数据写入磁盘 （各写入百分之50，至少两块硬盘）</li>
<li>RAID 1 :      镜像方式（自动做备份 ，至少两块硬盘）</li>
<li>RAID 5 ：   RAID 0 和 RAID  1的结合(轮流写入数据和校验) （坏掉两块磁盘数据还是会丢失）</li>
<li>RAID 10 ： RAID 1 和 RAID 0 的结合（最少准备四块硬盘）（各两块做RAID1,可以坏两块）</li>
</ul>
</li>
<li><p><strong>RAID 实现方式</strong></p>
<ul>
<li>软件实现  (学习用，CPU会飙升）</li>
<li><strong>硬件实现（工作用）</strong></li>
</ul>
</li>
</ul>
<h4 id="1-软件实现"><a href="#1-软件实现" class="headerlink" title="1. 软件实现"></a>1. 软件实现</h4><ol>
<li>安装<code>mdadm</code> : <code>yum install mdadm</code></li>
<li>创建阵列 ：<code>mdadm -C /dev/md0  -a yes -l1 -n2 可以使用的磁盘分区的名称(/dev/sdb1 /dev/sdc1)</code> <ul>
<li><code>-C :</code>创建阵列</li>
<li><code>/dev/md0 :</code> 约定俗成的设备名</li>
<li><code>-a yes</code> :  表示同意后面提示</li>
<li><code>-l</code> : RAID级别<ul>
<li><code>l1</code>  : RAID1</li>
</ul>
</li>
<li><code>-n2</code> : 设置几块活动硬盘</li>
</ul>
</li>
<li>查看阵列 ： <code>mdadm —D /dev/md0</code></li>
<li>停止RAID ： <code>mdadm --stop /dev/md0</code></li>
</ol>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20210105/110737374.png" alt="mark"></p>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20210105/111227817.png" alt="mark"></p>
<p><strong>注意：</strong></p>
<ol>
<li><p>如果不对<code>/dev/md0</code> 进行数据的读写，而对<code>/dev/sdb1 /dev/sdb2</code> 进行读写</p>
<ul>
<li><strong>那么RAID就是会失效的</strong></li>
<li>这提供了破坏RAID 的方式，也就是各向磁盘写入数据</li>
</ul>
</li>
<li><p><strong>RAID 结构 ： 使用<code>/dev/md0</code></strong></p>
<ul>
<li><strong>RAID本质 ： 在底层实体硬盘上再叠一层，对虚拟的硬盘进行操作</strong></li>
<li><code>/dev/md0</code> ： <strong>也是所谓的一个逻辑卷</strong></li>
</ul>
</li>
<li><p><strong>开机自动加载RAID 磁盘</strong></p>
<ul>
<li><code>echo DEVICE /dev/sd[b,c]1 &gt;&gt;/etc/mdadm.conf</code></li>
<li><code>mdadm -Evs &gt;&gt; /etc/mdadm.conf</code></li>
<li><code>mkfs.xfs /dev/md0</code></li>
</ul>
</li>
<li><p><strong>磁盘的大小最好是一样的</strong></p>
</li>
<li><p><strong>软件破坏超级块 : 有几块硬盘同时破坏几块</strong></p>
<ul>
<li><code>dd if=/dev/zero of=/dev/sdb1 bs=1M count=1</code></li>
<li><code>dd if=/dev/zero of=/dev/sdc1 bs=1M count=1</code></li>
</ul>
</li>
<li><p><strong>硬件破坏RAID ： 拔了硬盘就好</strong></p>
</li>
</ol>
<h3 id="8-7-逻辑卷管理"><a href="#8-7-逻辑卷管理" class="headerlink" title="8.7 逻辑卷管理"></a>8.7 逻辑卷管理</h3><p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20210105/114009519.png" alt="mark"></p>
<ul>
<li><strong>物理设备</strong>就是一个  <strong>物理卷</strong></li>
<li><strong>逻辑卷</strong>使用起来比物理卷更加灵活<ul>
<li><strong>逻辑卷是建立在物理设备上的一个虚拟卷</strong></li>
<li><strong>LVM将存储虚拟化,使用逻辑卷,你不会受限于物理磁盘的大小</strong>,另外,和硬件相关的存储设置被其隐藏,你能不用停止应用或卸载文件系统来调整卷大小或数据迁移.这样能减少操作成本，LVM最大的特点就是可以对磁盘进行动态管理。</li>
<li>因为逻辑卷的大小是可以动态调整的，而且不会丢失现有的数据。如果我们新增加了硬盘，其也不会改变现有上层的逻辑卷。作为一个<strong>动态磁盘管理机制</strong>，逻辑卷技术大大提高了磁盘管理的灵活性。</li>
</ul>
</li>
<li><strong>作用：</strong><ul>
<li>可以将硬盘进行隔离</li>
<li>可以将两个硬盘进行合并</li>
</ul>
</li>
<li><strong>逻辑卷本质 ： 在传统硬盘底层再叠一层，以后的操作是对逻辑卷这个虚拟的硬盘进行操作</strong><ul>
<li>LVM就是通过将底层的物理硬盘抽象的封装起来，然后以逻辑卷的方式呈现给上层应用。</li>
<li>在传统的磁盘管理机制中，我们的上层应用是直接访问文件系统，从而对底层的物理硬盘进行读取</li>
<li>而在LVM中，其通过对底层的硬盘进行封装，当我们对底层的物理硬盘进行操作时，其不再是针对于分区进行操作，而是通过一个叫做逻辑卷的东西来对其进行底层的磁盘管理操作。</li>
</ul>
</li>
</ul>
<hr>
<ul>
<li><strong>传统磁盘操作 ： 对硬盘数据进行扩容</strong><ul>
<li>首先把数据进行拷走</li>
<li>然后重新对硬盘进行分区</li>
</ul>
</li>
<li><strong>工作当中 ：服务器数据是不动的，拷走是不可能的</strong><ul>
<li>这么大的数据量移动是不可能的</li>
<li>一般工作中对磁盘空间操作都是只增不减</li>
<li>传统文件系统 ： 无法跨硬盘进行使用</li>
</ul>
</li>
</ul>
<p><strong>补充知识 ：</strong></p>
<ol>
<li><p><strong>物理卷（PV, Physical Volume）</strong></p>
<ul>
<li><strong>物理卷就是指磁盘,磁盘分区或从逻辑上和磁盘分区具有同样功能的设备(如RAID)</strong></li>
<li>是LVM的基本存储逻辑块，但和基本的物理存储介质（如分区、磁盘等）比较，却包含有和LVM相关的管理参数。当前LVM允许你在每个物理卷上保存这个物理卷的0至2份元数据拷贝.默认为1,保存在设备的开始处.为2时,在设备结束处保存第二份备份.</li>
</ul>
</li>
<li><p><strong>卷组（VG, Volume Group）</strong></p>
<ul>
<li><strong>LVM卷组类似于非LVM系统中的物理硬盘，其由物理卷组成。</strong>能在卷组上创建一个或多个“LVM分区”（逻辑卷），LVM卷组由一个或多个物理卷组成。</li>
</ul>
</li>
<li><p><strong>逻辑卷（LV, Logical Volume）</strong></p>
<ul>
<li>LVM的逻辑卷类似于非LVM系统中的硬盘分区，<strong>在逻辑卷之上能建立文件系统(比如/home或/usr等)。</strong></li>
</ul>
</li>
</ol>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20210106/091701217.png" alt="mark"></p>
<p><strong>前提操作</strong></p>
<p><strong>1：检查系统中是否安装了LVM管理工具</strong></p>
<p><code># rpm -qa|grep lvm</code></p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">[root@localhost ~]# rpm -qa |grep lvm</span><br><span class="line">lvm2-2.02.177-4.el7.x86_64</span><br><span class="line">llvm-private-5.0.0-3.el7.x86_64</span><br><span class="line">lvm2-libs-2.02.177-4.el7.x86_64</span><br><span class="line">[root@localhost ~]#</span><br></pre></td></tr></table></figure>

<p><strong>2：如果未安装，则使用yum 方式安装</strong></p>
<p><code>yum install lvm</code></p>
<p><code># rpm -qa|grep lvm</code></p>
<h4 id="1-增加逻辑卷"><a href="#1-增加逻辑卷" class="headerlink" title="1. 增加逻辑卷"></a>1. 增加逻辑卷</h4><ul>
<li><strong>新建逻辑卷</strong></li>
</ul>
<ol>
<li><p><strong>添加硬盘</strong> </p>
<ul>
<li>查看自己的硬盘 <code>fdisk -l</code></li>
</ul>
</li>
<li><p><strong>创建物理卷</strong></p>
<ul>
<li><code>pvcreate  /dev/sd[b,c,d]1</code>   ： 创建三个物理卷</li>
</ul>
</li>
<li><p><code>pvs</code> 进行查看 ： 要显示的物理卷列表。</p>
</li>
</ol>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20210105/170252083.png" alt="mark"></p>
<ol start="4">
<li><strong>建立卷组</strong> :<code>vgcreate 卷组名 要加入卷组的设备</code><ul>
<li><code>vgcreate vg1 /dev/sdb1 /dev/sdc1</code></li>
<li><strong>注意 ： 一个PV 是不能加到两个不同的卷组的</strong></li>
</ul>
</li>
</ol>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20210105/170420044.png" alt="mark"></p>
<ol start="5">
<li><strong>查看卷组</strong> ： <code>vgs</code><ul>
<li>centos  ：<code>pv  = 1</code> 说明物理卷有一个</li>
<li><strong>centos  :   中间有一个卷组</strong></li>
<li>centos  :   <code>lv = 2</code>   说明逻辑卷有两个（<code>/boot</code>   <code>/</code>）</li>
</ul>
</li>
</ol>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20210105/170612048.png" alt="mark"></p>
<ol start="6">
<li><strong>创建逻辑卷</strong><ul>
<li><code>lvcreate -L 100M -n lv1 卷组名字</code><ul>
<li><code>-L</code> ： 指定逻辑卷的大小</li>
<li><code>-n</code> :    指定逻辑卷的名字</li>
</ul>
</li>
</ul>
</li>
</ol>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20210105/170914670.png" alt="mark"></p>
<h4 id="2-使用逻辑卷"><a href="#2-使用逻辑卷" class="headerlink" title="2. 使用逻辑卷"></a>2. 使用逻辑卷</h4><ol>
<li><strong>格式化</strong><ul>
<li><code>mkfs.xfs /dev/vg1/lv1</code></li>
</ul>
</li>
<li><strong>进行挂载</strong><ul>
<li><code>mkdir</code></li>
<li><code>mount</code></li>
</ul>
</li>
</ol>
<p><strong>逻辑卷的整个流程 : 分层结构</strong></p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">fdisk进行分区-&gt;物理卷pv-&gt;卷组vg-&gt;逻辑卷lv-&gt;文件系统xfs-&gt;挂载mount</span><br><span class="line"></span><br><span class="line">逻辑卷功能 ： 动态增大磁盘大小</span><br><span class="line">最主要步骤 ： 物理卷pv-&gt;卷组vg-&gt;逻辑卷lv</span><br><span class="line"></span><br><span class="line">再加个RAID : fdisk进行分区-&gt;&#x2F;dev&#x2F;md0-&gt;物理卷pv-&gt;卷组vg-&gt;逻辑卷lv-&gt;文件系统xfs-&gt;挂载mount</span><br></pre></td></tr></table></figure>



<h4 id="3-扩展分区-（lvm）"><a href="#3-扩展分区-（lvm）" class="headerlink" title="3. 扩展分区 （lvm）"></a>3. 扩展分区 （lvm）</h4><ul>
<li>扩展现有的分区<ul>
<li>根目录</li>
<li>boot目录</li>
</ul>
</li>
</ul>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20210105/173150352.png" alt="mark"></p>
<p><strong>概括：</strong></p>
<ul>
<li>vg空间不够，需先扩展vg，扩展vg就是往vg中加pv</li>
<li><ol>
<li>新建pv, </li>
</ol>
</li>
<li><ol start="2">
<li>进行扩容(vg)，</li>
</ol>
</li>
<li><ol start="3">
<li>再查看</li>
<li>进行扩容(lv)</li>
</ol>
</li>
</ul>
<ol>
<li><p><strong>给 vg 扩充空间</strong></p>
<ul>
<li><p><code>pvcreate /dev/sdd1</code> : 新建pv</p>
</li>
<li><p><code>vgextend centos /dev/sdd1</code>  ： <code>vgextend 扩充谁 用谁扩充</code></p>
</li>
<li><p><code>pvs</code></p>
</li>
<li><p><code>lvs</code></p>
</li>
<li><p><code>vgs</code></p>
</li>
</ul>
</li>
</ol>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20210105/173429708.png" alt="mark"></p>
<ol start="2">
<li><strong>给<code>lv</code> 扩充空间</strong></li>
</ol>
<ul>
<li><code>lvextend -L +50G /dev/centos/root</code> : <strong>给root逻辑卷增加50G的逻辑卷</strong></li>
<li><code>pvs</code></li>
<li><code>lvs</code></li>
<li><code>vgs</code></li>
<li>注意 ： 给lv加的容量要小于vg的容量</li>
</ul>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20210105/173621196.png" alt="mark"></p>
<p><strong>注意  ： 空间真的变大了吗？</strong></p>
<ul>
<li><code>df -h</code> ：  查看发现一件奇怪的事情<ul>
<li><strong>原因：逻辑卷上一层还有文件系统，文件系统还未进行扩大</strong></li>
<li><strong>层次结构 ： 物理卷 -》 逻辑卷-》文件系统</strong><ul>
<li><strong>不同分层解决不同的问题</strong></li>
</ul>
</li>
</ul>
</li>
</ul>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20210105/173715810.png" alt="mark"></p>
<ul>
<li><strong>解决方法</strong></li>
<li><code>xfs_growfs /dev/centos/root</code> ：  告诉文件系统已经扩大了（xfs系统）</li>
</ul>
<hr>
<ul>
<li><strong>缩容 ： 不建议使用</strong></li>
</ul>
<p>1：umount 文件系统</p>
<p>2：缩减文件系统</p>
<p><strong>此处参考博客：</strong> <a href="https://blog.csdn.net/qq_27281257/article/details/81603410" target="_blank" rel="noopener">https://blog.csdn.net/qq_27281257/article/details/81603410</a></p>
<h3 id="8-8-系统检查故障问题"><a href="#8-8-系统检查故障问题" class="headerlink" title="8.8 系统检查故障问题"></a>8.8 系统检查故障问题</h3><p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20210105/190045942.png" alt="mark"></p>
<p><code>sar</code> 命令安装 ： <code>yum install sysstat</code></p>
<h4 id="1-sar"><a href="#1-sar" class="headerlink" title="1. sar"></a>1. sar</h4><ol>
<li><strong>cpu 利用率</strong></li>
</ol>
<ul>
<li><p><code>sar -p</code>（查看全天）</p>
</li>
<li><p><code>sar -u 1 10</code>（1：每隔一秒，10：写入10次）  </p>
</li>
</ul>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20210105/190353090.png" alt="mark"></p>
<p><strong>CPU输出项说明</strong></p>
<table>
<thead>
<tr>
<th><strong>输出项</strong></th>
<th><strong>详细说明</strong></th>
</tr>
</thead>
<tbody><tr>
<td>CPU</td>
<td>all 表示统计信息为所有 CPU 的平均值。</td>
</tr>
<tr>
<td>%user</td>
<td>显示在用户级别(application)运行使用 CPU 总时间的百分比。</td>
</tr>
<tr>
<td>%nice</td>
<td>显示在用户级别，用于nice操作，所占用 CPU 总时间的百分比。</td>
</tr>
<tr>
<td>%system</td>
<td>在核心级别(kernel)运行所使用 CPU 总时间的百分比。</td>
</tr>
<tr>
<td>%iowait</td>
<td>显示用于等待I/O操作占用 CPU 总时间的百分比。</td>
</tr>
<tr>
<td>%steal</td>
<td>管理程序(hypervisor)为另一个虚拟进程提供服务而等待虚拟 CPU 的百分比。</td>
</tr>
<tr>
<td>%idle</td>
<td>显示 CPU 空闲时间占用 CPU 总时间的百分比。</td>
</tr>
</tbody></table>
<ol start="2">
<li><strong>内存情况</strong></li>
</ol>
<ul>
<li><p><code>sar -r</code> （查看全天） </p>
</li>
<li><p><code>sar -r 1 10</code> （1：每隔一秒，10：写入10次） </p>
</li>
</ul>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20210105/190524289.png" alt="mark"></p>
<table>
<thead>
<tr>
<th><strong>输出项</strong></th>
<th><strong>详细说明</strong></th>
</tr>
</thead>
<tbody><tr>
<td>kbmemfree</td>
<td>这个值和free命令中的free值基本一致，所以它不包括buffer和cache的空间。</td>
</tr>
<tr>
<td>kbmemused</td>
<td>这个值和free命令中的used值基本一致，所以它包括buffer和cache的空间。</td>
</tr>
<tr>
<td>%memused</td>
<td>这个值是kbmemused和内存总量(不包括swap)的一个百分比。</td>
</tr>
<tr>
<td>kbbuffers和kbcached</td>
<td>这两个值就是free命令中的buffer和cache。</td>
</tr>
<tr>
<td>kbcommit</td>
<td>保证当前系统所需要的内存，即为了确保不溢出而需要的内存(RAM+swap)。</td>
</tr>
<tr>
<td>%commit</td>
<td>这个值是kbcommit与内存总量(包括swap)的一个百分比。</td>
</tr>
</tbody></table>
<ol start="3">
<li><strong>磁盘IO情况</strong></li>
</ol>
<ul>
<li><p><code>sar -d</code>（查看全天）</p>
</li>
<li><p><code>sar -d 1 2</code>（1：每隔一秒，2：写入2次）</p>
</li>
</ul>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20210105/190602015.png" alt="mark"></p>
<table>
<thead>
<tr>
<th><strong>输出项</strong></th>
<th><strong>详细说明</strong></th>
</tr>
</thead>
<tbody><tr>
<td>await</td>
<td>表示平均每次设备I/O操作的等待时间（以毫秒为单位）。</td>
</tr>
<tr>
<td>svctm</td>
<td>表示平均每次设备I/O操作的服务时间（以毫秒为单位）。</td>
</tr>
<tr>
<td>%util</td>
<td>表示一秒中有百分之几的时间用于I/O操作。</td>
</tr>
</tbody></table>
<ol start="4">
<li><strong>进程的使用</strong></li>
</ol>
<ul>
<li><p><code>sar -q</code></p>
</li>
<li><p><code>sar -q 1 10</code></p>
</li>
</ul>
<ol start="5">
<li><strong>IO情况</strong></li>
</ol>
<ul>
<li><code>sar -b</code></li>
<li><code>sar -b 1 10</code></li>
</ul>
<ol start="6">
<li><strong>网络流量</strong></li>
</ol>
<ul>
<li><p><code>sar -n DEV</code>（查看全天）</p>
</li>
<li><p><code>sar -n DEV 1 2</code>（1：每隔一秒，2：写入2次）</p>
</li>
</ul>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20210105/190858673.png" alt="mark"></p>
<table>
<thead>
<tr>
<th><strong>输出项</strong></th>
<th><strong>详细说明</strong></th>
</tr>
</thead>
<tbody><tr>
<td>IFACE</td>
<td>就是网络设备的名称。</td>
</tr>
<tr>
<td>rxpck/s</td>
<td>每秒钟接收到的包数目。</td>
</tr>
<tr>
<td>txpck/s</td>
<td>每秒钟发送出去的包数目。</td>
</tr>
<tr>
<td>rxkB/s</td>
<td>每秒钟接收到的字节数。</td>
</tr>
<tr>
<td>txkB/s</td>
<td>每秒钟发送出去的字节数。</td>
</tr>
<tr>
<td>rxcmp/s</td>
<td>每秒钟接收到的压缩包数目。</td>
</tr>
<tr>
<td>txcmp/s</td>
<td>每秒钟发送出去的压缩包数目。</td>
</tr>
<tr>
<td>rxmcst/s</td>
<td>每秒钟接收到的多播包的包数目。</td>
</tr>
</tbody></table>
<h4 id="2-iftop"><a href="#2-iftop" class="headerlink" title="2. iftop"></a>2. iftop</h4><ul>
<li><p><strong>查看本地网络流量情况</strong></p>
</li>
<li><p><code>iftop -P</code></p>
</li>
</ul>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20210105/191048391.png" alt="mark"></p>
<h2 id="9-shell"><a href="#9-shell" class="headerlink" title="9. shell"></a>9. shell</h2><p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20210105/191356872.png" alt="mark"></p>
<h3 id="9-1-什么是shell"><a href="#9-1-什么是shell" class="headerlink" title="9.1 什么是shell?"></a>9.1 什么是shell?</h3><p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20210105/191459243.png" alt="mark"></p>
<ul>
<li>Shell 是一个用 C 语言编写的程序，它是用户使用 Linux 的桥梁。<strong>Shell 既是一种命令语言，又是一种程序设计语言。</strong></li>
<li><strong>Shell 是指一种应用程序，这个应用程序提供了一个界面，用户通过这个界面访问操作系统内核的服务。</strong></li>
<li><code>Ken Thompson</code> 的 sh 是第一种 <code>Unix Shell</code>，Windows Explorer 是一个典型的图形界面 Shell。</li>
</ul>
<p><a href="https://www.runoob.com/try/showbash.php?filename=helloworld" target="_blank" rel="noopener"><strong>Shell 在线工具</strong></a></p>
<p><strong>命令解释器</strong></p>
<ul>
<li>Shell 编程跟<code>JavaScript、php</code> 编程一样，只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了。</li>
<li><code>Linux</code> 的 <code>Shell</code> 种类众多，常见的有：</li>
</ul>
<figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">[root@zhuuu ~]<span class="comment"># cat /etc/shells </span></span><br><span class="line">/bin/sh</span><br><span class="line">/bin/bash</span><br><span class="line">/usr/bin/sh</span><br><span class="line">/usr/bin/bash</span><br><span class="line">/bin/tcsh</span><br><span class="line">/bin/csh</span><br><span class="line"></span><br><span class="line">本教程关注的是 Bash，也就是 Bourne Again Shell，由于易用和免费，Bash 在日常工作中被广泛使用。同时，Bash 也是大多数Linux 系统默认的 Shell。</span><br><span class="line"></span><br><span class="line">在一般情况下，人们并不区分 Bourne Shell 和 Bourne Again Shell，所以，像 <span class="comment">#!/bin/sh，它同样也可以改为 #!/bin/bash。</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#! 告诉系统其后路径所指定的程序即是解释此脚本文件的 Shell 程序。</span></span><br></pre></td></tr></table></figure>



<h3 id="9-2-Linux-启动过程"><a href="#9-2-Linux-启动过程" class="headerlink" title="9.2 Linux 启动过程"></a>9.2 Linux 启动过程</h3><p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20210106/101300268.png" alt="mark"></p>
<p><strong>上述图为centos7,下面文字为centos6.</strong></p>
<p>linux启动时我们会看到许多启动信息。</p>
<p>Linux系统的启动过程并不是大家想象中的那么复杂，其过程可以分为5个阶段：</p>
<ul>
<li>内核的引导。</li>
<li>运行 init。</li>
<li>系统初始化。</li>
<li>建立终端 。</li>
<li>用户登录系统。</li>
</ul>
<p><strong>init程序的类型：</strong></p>
<ul>
<li><strong>SysV:</strong> init, CentOS 5之前, 配置文件： /etc/inittab。</li>
<li><strong>Upstart:</strong> init,CentOS 6, 配置文件： /etc/inittab, /etc/init/*.conf。</li>
<li><strong>Systemd：</strong> systemd, CentOS 7,配置文件： /usr/lib/systemd/system、 /etc/systemd/system。</li>
</ul>
<h4 id="1-内核引导"><a href="#1-内核引导" class="headerlink" title="1. 内核引导"></a>1. 内核引导</h4><ul>
<li>当计算机打开电源后，首先是BIOS开机自检，按照BIOS中设置的启动设备（通常是硬盘）来启动。</li>
<li>操作系统接管硬件以后，首先读入 /boot 目录下的内核文件。</li>
</ul>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20210106/101512420.png" alt="mark"></p>
<h4 id="2-运行init-1号进程"><a href="#2-运行init-1号进程" class="headerlink" title="2. 运行init(1号进程)"></a>2. 运行init(1号进程)</h4><ul>
<li><p>init 进程是系统所有进程的起点，你可以把它比拟成系统所有进程的老祖宗，没有这个进程，系统中任何进程都不会启动。</p>
</li>
<li><p>init 程序首先是需要读取配置文件 <code>/etc/inittab</code></p>
</li>
</ul>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20210106/101548955.png" alt="mark"></p>
<h4 id="3-运行级别"><a href="#3-运行级别" class="headerlink" title="3. 运行级别"></a>3. 运行级别</h4><ul>
<li><p>许多程序需要开机启动。它们在Windows叫做”服务”（service），<strong>在Linux就叫做”守护进程”（daemon）。</strong></p>
</li>
<li><p>init进程的一大任务，就是去运行这些开机启动的程序。</p>
<ul>
<li>但是，不同的场合需要启动不同的程序，比如用作服务器时，需要启动Apache，用作桌面就不需要。</li>
</ul>
</li>
<li><p>Linux允许为不同的场合，分配不同的开机启动程序，这就叫做”运行级别”（runlevel）。也就是说，启动时根据”运行级别”，确定要运行哪些程序。</p>
</li>
</ul>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20210106/101649621.png" alt="mark"></p>
<p><strong>Linux系统有7个运行级别(runlevel)：</strong></p>
<ul>
<li>运行级别0：系统停机状态，系统默认运行级别不能设为0，否则不能正常启动</li>
<li>运行级别1：单用户工作状态，root权限，用于系统维护，禁止远程登陆</li>
<li>运行级别2：多用户状态(没有NFS)</li>
<li>运行级别3：完全的多用户状态(有NFS)，登陆后进入控制台命令行模式</li>
<li>运行级别4：系统未使用，保留</li>
<li>运行级别5：X11控制台，登陆后进入图形GUI模式</li>
<li>运行级别6：系统正常关闭并重启，默认运行级别不能设为6，否则不能正常启动</li>
</ul>
<h4 id="4-系统初始化"><a href="#4-系统初始化" class="headerlink" title="4. 系统初始化"></a>4. 系统初始化</h4><p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20210106/102251678.png" alt="mark"></p>
<ul>
<li><p>在init的配置文件中有这么一行： <code>si::sysinit:/etc/rc.d/rc.sysinit</code>　它调用执行了<code>/etc/rc.d/rc.sysinit</code>，而<code>rc.sysinit</code>是一个<code>bash shell</code>的脚本，它主要是完成一些系统初始化的工作，<code>rc.sysinit</code>是每一个运行级别都要首先运行的重要脚本。</p>
</li>
<li><p>它主要完成的工作有：激活交换分区，检查磁盘，加载硬件模块以及其它一些需要优先执行任务。</p>
</li>
</ul>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">l5:5:wait:&#x2F;etc&#x2F;rc.d&#x2F;rc 5</span><br></pre></td></tr></table></figure>

<ul>
<li><p>这一行表示以5为参数运行<code>/etc/rc.d/rc</code>，<code>/etc/rc.d/rc</code>是一个Shell脚本，它接受5作为参数，去执行<code>/etc/rc.d/rc5.d/</code>目录下的所有的rc启动脚本，<code>/etc/rc.d/rc5.d/</code>目录中的这些启动脚本实际上都是一些连接文件，而不是真正的rc启动脚本，真正的rc启动脚本实际上都是放在<code>/etc/rc.d/init.d/</code>目录下。</p>
</li>
<li><p>而这些rc启动脚本有着类似的用法，它们一般能接受start、stop、restart、status等参数。</p>
</li>
</ul>
<h4 id="5-建立终端"><a href="#5-建立终端" class="headerlink" title="5. 建立终端"></a>5. 建立终端</h4><ul>
<li>rc执行完毕后，返回init。这时基本系统环境已经设置好了，各种守护进程也已经启动了。</li>
<li>init接下来会打开6个终端，以便用户登录系统。在inittab中的以下6行就是定义了6个终端：</li>
</ul>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">1:2345:respawn:&#x2F;sbin&#x2F;mingetty tty1</span><br><span class="line">2:2345:respawn:&#x2F;sbin&#x2F;mingetty tty2</span><br><span class="line">3:2345:respawn:&#x2F;sbin&#x2F;mingetty tty3</span><br><span class="line">4:2345:respawn:&#x2F;sbin&#x2F;mingetty tty4</span><br><span class="line">5:2345:respawn:&#x2F;sbin&#x2F;mingetty tty5</span><br><span class="line">6:2345:respawn:&#x2F;sbin&#x2F;mingetty tty6</span><br></pre></td></tr></table></figure>

<ul>
<li>从上面可以看出在2、3、4、5的运行级别中都将以respawn方式运行mingetty程序，mingetty程序能打开终端、设置模式。</li>
<li>同时它会显示一个文本登录界面，这个界面就是我们经常看到的登录界面，在这个登录界面中会提示用户输入用户名，而用户输入的用户将作为参数传给login程序来验证用户的身份。</li>
</ul>
<h4 id="6-用户登录系统"><a href="#6-用户登录系统" class="headerlink" title="6. 用户登录系统"></a>6. 用户登录系统</h4><p>一般来说，用户的登录方式有三种：</p>
<ul>
<li>（1）命令行登录</li>
<li>（2）ssh登录</li>
<li>（3）图形界面登录</li>
</ul>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20210106/105006930.png" alt="mark"></p>
<p><strong>图形方式登录</strong></p>
<p>对于运行级别为5的图形方式用户来说，他们的登录是通过一个图形化的登录界面。登录成功后可以直接进入 KDE、Gnome 等窗口管理器。</p>
<p>而本文主要讲的还是文本方式登录的情况：当我们看到mingetty的登录界面时，我们就可以输入用户名和密码来登录系统了。</p>
<p><strong>文字模式登录</strong></p>
<ul>
<li><code>Linux</code> 的账号验证程序是<code>login</code>，<code>login</code>会接收 <code>mingetty</code>传来的用户名作为用户名参数。</li>
<li>然后 <code>login</code>会对用户名进行分析：如果用户名不是 root，且存在<code>/etc/nologin</code> 文件，login 将输出<code>nologin</code> 文件的内容，然后退出。</li>
<li>这通常用来系统维护时防止非root用户登录。只有<code>/etc/securetty</code>中登记了的终端才允许 root 用户登录<ul>
<li>如果不存在这个文件，则 root 用户可以在任何终端上登录。</li>
<li><code>/etc/usertty</code>文件用于对用户作出附加访问限制，如果不存在这个文件，则没有其他限制。</li>
</ul>
</li>
</ul>
<h4 id="5-图形模式和文字模式切换"><a href="#5-图形模式和文字模式切换" class="headerlink" title="5. 图形模式和文字模式切换"></a>5. 图形模式和文字模式切换</h4><ul>
<li><p><strong>Linux预设提供了六个命令窗口终端机让我们来登录。</strong></p>
</li>
<li><p><strong>默认我们登录的就是第一个窗口，也就是tty1，这个六个窗口分别为tty1,tty2 … tty6，你可以按下Ctrl + Alt + F1 ~ F6 来切换它们</strong></p>
</li>
<li><p>如果你安装了图形界面，默认情况下是进入图形界面的，此时你就可以按Ctrl + Alt + F1 ~ F6来进入其中一个命令窗口界面。</p>
</li>
<li><p>当你进入命令窗口界面后再返回图形界面只要按下Ctrl + Alt + F7 就回来了。</p>
</li>
<li><p>如果你用的vmware 虚拟机，命令窗口切换的快捷键为 Alt + Space + F1<del>F6. 如果你在图形界面下请按Alt + Shift + Ctrl + F1</del>F6 切换至命令窗口。</p>
</li>
</ul>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20210106/105327004.png" alt="mark"></p>
<h4 id="7-linux-关机"><a href="#7-linux-关机" class="headerlink" title="7. linux 关机"></a>7. linux 关机</h4><p>在linux领域内大多用在服务器上，很少遇到关机的操作。毕竟服务器上跑一个服务是永无止境的，除非特殊情况下，不得已才会关机。</p>
<p>正确的关机流程为：<code>sync &gt; shutdown &gt; reboot &gt; halt</code></p>
<p>关机指令为：shutdown ，你可以man shutdown 来看一下帮助文档。</p>
<p>例如你可以运行如下命令关机：</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line">sync 将数据由内存同步到硬盘中。</span><br><span class="line"></span><br><span class="line">shutdown 关机指令，你可以man shutdown 来看一下帮助文档。例如你可以运行如下命令关机：</span><br><span class="line"></span><br><span class="line">shutdown –h 10 ‘This server will shutdown after 10 mins’ 这个命令告诉大家，计算机将在10分钟后关机，并且会显示在登陆用户的当前屏幕中。</span><br><span class="line"></span><br><span class="line">shutdown –h now 立马关机</span><br><span class="line"></span><br><span class="line">shutdown –h 20:25 系统会在今天20:25关机</span><br><span class="line"></span><br><span class="line">shutdown –h +10 十分钟后关机</span><br><span class="line"></span><br><span class="line">shutdown –r now 系统立马重启</span><br><span class="line"></span><br><span class="line">shutdown –r +10 系统十分钟后重启</span><br><span class="line"></span><br><span class="line">reboot 就是重启，等同于 shutdown –r now</span><br><span class="line"></span><br><span class="line">halt 关闭系统，等同于shutdown –h now 和 poweroff</span><br></pre></td></tr></table></figure>

<ul>
<li><p>最后总结一下，不管是重启系统还是关闭系统，首先要运行 <strong>sync</strong> 命令，把内存中的数据写到磁盘中。 </p>
</li>
<li><p>关机的命令有 <strong>shutdown –h now /halt/ poweroff</strong> 和 <strong>init 0</strong> , 重启系统的命令有 <strong>shutdown –r now /reboot/ init 6</strong>。 </p>
</li>
</ul>
<h3 id="9-3-启动文件位置"><a href="#9-3-启动文件位置" class="headerlink" title="9.3 启动文件位置"></a>9.3 启动文件位置</h3><h4 id="1-MBR-位置"><a href="#1-MBR-位置" class="headerlink" title="1. MBR 位置"></a>1. MBR 位置</h4><ol>
<li>将MBR的引导写出来(<strong>446字节</strong>) ： <code>dd if=/dev/vda of=mbr.bin bs=446 count=1</code></li>
<li>16进制字符查看mbr ： <code>hexdump -C mbr.bin</code></li>
<li>将MBR的引导写出来(<strong>512字节</strong>) ： <code>dd if=/dev/vda of=mbr.bin bs=512 count=1</code><ul>
<li>512 字节包含磁盘的分区表</li>
<li>55 aa   ： 说明该磁盘可以正确引导</li>
</ul>
</li>
</ol>
<figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br></pre></td><td class="code"><pre><span class="line">[root@zhuuu ~]<span class="comment"># dd if=/dev/vda of=mbr.bin bs=446 count=1</span></span><br><span class="line">1+0 records <span class="keyword">in</span></span><br><span class="line">1+0 records out</span><br><span class="line">446 bytes (446 B) copied, 0.000123157 s, 3.6 MB/s</span><br><span class="line">[root@zhuuu ~]<span class="comment"># hexdump -C mbr.bin</span></span><br><span class="line">00000000  eb 63 90 10 8e d0 bc 00  b0 b8 00 00 8e d8 8e c0  |.c..............|</span><br><span class="line">00000010  fb be 00 7c bf 00 06 b9  00 02 f3 a4 ea 21 06 00  |...|.........!..|</span><br><span class="line">00000020  00 be be 07 38 04 75 0b  83 c6 10 81 fe fe 07 75  |....8.u........u|</span><br><span class="line">00000030  f3 eb 16 b4 02 b0 01 bb  00 7c b2 80 8a 74 01 8b  |.........|...t..|</span><br><span class="line">00000040  4c 02 <span class="built_in">cd</span> 13 ea 00 7c 00  00 eb fe 00 00 00 00 00  |L.....|.........|</span><br><span class="line">00000050  00 00 00 00 00 00 00 00  00 00 00 80 01 00 00 00  |................|</span><br><span class="line">00000060  00 00 00 00 ff fa 90 90  f6 c2 80 74 05 f6 c2 70  |...........t...p|</span><br><span class="line">00000070  74 02 b2 80 ea 79 7c 00  00 31 c0 8e d8 8e d0 bc  |t....y|..1......|</span><br><span class="line">00000080  00 20 fb a0 64 7c 3c ff  74 02 88 c2 52 be 05 7c  |. ..d|&lt;.t...R..||</span><br><span class="line">00000090  b4 41 bb aa 55 <span class="built_in">cd</span> 13 5a  52 72 3d 81 fb 55 aa 75  |.A..U..ZRr=..U.u|</span><br><span class="line">000000a0  37 83 e1 01 74 32 31 c0  89 44 04 40 88 44 ff 89  |7...t21..D.@.D..|</span><br><span class="line">000000b0  44 02 c7 04 10 00 66 8b  1e 5c 7c 66 89 5c 08 66  |D.....f..\|f.\.f|</span><br><span class="line">000000c0  8b 1e 60 7c 66 89 5c 0c  c7 44 06 00 70 b4 42 <span class="built_in">cd</span>  |..`|f.\..D..p.B.|</span><br><span class="line">000000d0  13 72 05 bb 00 70 eb 76  b4 08 <span class="built_in">cd</span> 13 73 0d 5a 84  |.r...p.v....s.Z.|</span><br><span class="line">000000e0  d2 0f 83 de 00 be 85 7d  e9 82 00 66 0f b6 c6 88  |.......&#125;...f....|</span><br><span class="line">000000f0  64 ff 40 66 89 44 04 0f  b6 d1 c1 e2 02 88 e8 88  |d.@f.D..........|</span><br><span class="line">00000100  f4 40 89 44 08 0f b6 c2  c0 e8 02 66 89 04 66 a1  |.@.D.......f..f.|</span><br><span class="line">00000110  60 7c 66 09 c0 75 4e 66  a1 5c 7c 66 31 d2 66 f7  |`|f..uNf.\|f1.f.|</span><br><span class="line">00000120  34 88 d1 31 d2 66 f7 74  04 3b 44 08 7d 37 fe c1  |4..1.f.t.;D.&#125;7..|</span><br><span class="line">00000130  88 c5 30 c0 c1 e8 02 08  c1 88 d0 5a 88 c6 bb 00  |..0........Z....|</span><br><span class="line">00000140  70 8e c3 31 db b8 01 02  <span class="built_in">cd</span> 13 72 1e 8c c3 60 1e  |p..1......r...`.|</span><br><span class="line">00000150  b9 00 01 8e db 31 f6 bf  00 80 8e c6 <span class="built_in">fc</span> f3 a5 1f  |.....1..........|</span><br><span class="line">00000160  61 ff 26 5a 7c be 80 7d  eb 03 be 8f 7d e8 34 00  |a.&amp;Z|..&#125;....&#125;.4.|</span><br><span class="line">00000170  be 94 7d e8 2e 00 <span class="built_in">cd</span> 18  eb fe 47 52 55 42 20 00  |..&#125;.......GRUB .|</span><br><span class="line">00000180  47 65 6f 6d 00 48 61 72  64 20 44 69 73 6b 00 52  |Geom.Hard Disk.R|</span><br><span class="line">00000190  65 61 64 00 20 45 72 72  6f 72 0d 0a 00 bb 01 00  |ead. Error......|</span><br><span class="line">000001a0  b4 0e <span class="built_in">cd</span> 10 ac 3c 00 75  f4 c3 00 00 00 00 00 00  |.....&lt;.u........|</span><br><span class="line">000001b0  00 00 00 00 00 00 00 00  89 ac 09 00 00 00        |..............|</span><br><span class="line">000001be</span><br></pre></td></tr></table></figure>

<ul>
<li><strong>512 字节</strong></li>
</ul>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br></pre></td><td class="code"><pre><span class="line">[root@zhuuu ~]# dd if&#x3D;&#x2F;dev&#x2F;vda of&#x3D;mbr2.bin bs&#x3D;512 count&#x3D;1</span><br><span class="line">1+0 records in</span><br><span class="line">1+0 records out</span><br><span class="line">512 bytes (512 B) copied, 0.000130971 s, 3.9 MB&#x2F;s</span><br><span class="line">[root@zhuuu ~]# hexdump -C mbr2.bin</span><br><span class="line">00000000  eb 63 90 10 8e d0 bc 00  b0 b8 00 00 8e d8 8e c0  |.c..............|</span><br><span class="line">00000010  fb be 00 7c bf 00 06 b9  00 02 f3 a4 ea 21 06 00  |...|.........!..|</span><br><span class="line">00000020  00 be be 07 38 04 75 0b  83 c6 10 81 fe fe 07 75  |....8.u........u|</span><br><span class="line">00000030  f3 eb 16 b4 02 b0 01 bb  00 7c b2 80 8a 74 01 8b  |.........|...t..|</span><br><span class="line">00000040  4c 02 cd 13 ea 00 7c 00  00 eb fe 00 00 00 00 00  |L.....|.........|</span><br><span class="line">00000050  00 00 00 00 00 00 00 00  00 00 00 80 01 00 00 00  |................|</span><br><span class="line">00000060  00 00 00 00 ff fa 90 90  f6 c2 80 74 05 f6 c2 70  |...........t...p|</span><br><span class="line">00000070  74 02 b2 80 ea 79 7c 00  00 31 c0 8e d8 8e d0 bc  |t....y|..1......|</span><br><span class="line">00000080  00 20 fb a0 64 7c 3c ff  74 02 88 c2 52 be 05 7c  |. ..d|&lt;.t...R..||</span><br><span class="line">00000090  b4 41 bb aa 55 cd 13 5a  52 72 3d 81 fb 55 aa 75  |.A..U..ZRr&#x3D;..U.u|</span><br><span class="line">000000a0  37 83 e1 01 74 32 31 c0  89 44 04 40 88 44 ff 89  |7...t21..D.@.D..|</span><br><span class="line">000000b0  44 02 c7 04 10 00 66 8b  1e 5c 7c 66 89 5c 08 66  |D.....f..\|f.\.f|</span><br><span class="line">000000c0  8b 1e 60 7c 66 89 5c 0c  c7 44 06 00 70 b4 42 cd  |..&#96;|f.\..D..p.B.|</span><br><span class="line">000000d0  13 72 05 bb 00 70 eb 76  b4 08 cd 13 73 0d 5a 84  |.r...p.v....s.Z.|</span><br><span class="line">000000e0  d2 0f 83 de 00 be 85 7d  e9 82 00 66 0f b6 c6 88  |.......&#125;...f....|</span><br><span class="line">000000f0  64 ff 40 66 89 44 04 0f  b6 d1 c1 e2 02 88 e8 88  |d.@f.D..........|</span><br><span class="line">00000100  f4 40 89 44 08 0f b6 c2  c0 e8 02 66 89 04 66 a1  |.@.D.......f..f.|</span><br><span class="line">00000110  60 7c 66 09 c0 75 4e 66  a1 5c 7c 66 31 d2 66 f7  |&#96;|f..uNf.\|f1.f.|</span><br><span class="line">00000120  34 88 d1 31 d2 66 f7 74  04 3b 44 08 7d 37 fe c1  |4..1.f.t.;D.&#125;7..|</span><br><span class="line">00000130  88 c5 30 c0 c1 e8 02 08  c1 88 d0 5a 88 c6 bb 00  |..0........Z....|</span><br><span class="line">00000140  70 8e c3 31 db b8 01 02  cd 13 72 1e 8c c3 60 1e  |p..1......r...&#96;.|</span><br><span class="line">00000150  b9 00 01 8e db 31 f6 bf  00 80 8e c6 fc f3 a5 1f  |.....1..........|</span><br><span class="line">00000160  61 ff 26 5a 7c be 80 7d  eb 03 be 8f 7d e8 34 00  |a.&amp;Z|..&#125;....&#125;.4.|</span><br><span class="line">00000170  be 94 7d e8 2e 00 cd 18  eb fe 47 52 55 42 20 00  |..&#125;.......GRUB .|</span><br><span class="line">00000180  47 65 6f 6d 00 48 61 72  64 20 44 69 73 6b 00 52  |Geom.Hard Disk.R|</span><br><span class="line">00000190  65 61 64 00 20 45 72 72  6f 72 0d 0a 00 bb 01 00  |ead. Error......|</span><br><span class="line">000001a0  b4 0e cd 10 ac 3c 00 75  f4 c3 00 00 00 00 00 00  |.....&lt;.u........|</span><br><span class="line">000001b0  00 00 00 00 00 00 00 00  89 ac 09 00 00 00 80 00  |................|</span><br><span class="line">000001c0  21 02 83 0f ff ff 00 08  00 00 df f7 3f 06 00 00  |!...........?...|</span><br><span class="line">000001d0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|</span><br><span class="line">*</span><br><span class="line">000001f0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 55 aa  |..............U.|</span><br><span class="line">00000200</span><br></pre></td></tr></table></figure>



<h4 id="2-grub2-位置"><a href="#2-grub2-位置" class="headerlink" title="2. grub2 位置"></a>2. grub2 位置</h4><ul>
<li><p>位置 ： <code>cd /boot/grub2</code></p>
</li>
<li><p>目前引导内核  ： <code>grub2-editenv list</code></p>
<ul>
<li>或者 ： <code>uname -r</code></li>
</ul>
</li>
</ul>
<h4 id="3-init-systemd-区别"><a href="#3-init-systemd-区别" class="headerlink" title="3. init/systemd 区别"></a>3. init/systemd 区别</h4><ul>
<li><strong>一号进程</strong><ul>
<li><strong>init</strong> : <code>[root@zhuuu ~]# which init
/usr/sbin/init</code></li>
<li><code>systemd</code>:<code>/usr/lib/systemd/systemd</code></li>
</ul>
</li>
</ul>
<ol>
<li><strong>init</strong></li>
</ol>
<ul>
<li>系统脚本位置 ： <code>cd /etc/rc.d</code></li>
</ul>
<ol start="2">
<li><strong>systemd</strong></li>
</ol>
<ul>
<li>系统配置文件位置 ：<code>cd /etc/systemd/system</code></li>
</ul>
<p><strong>注意</strong></p>
<ul>
<li><strong><code>init</code> 用的是脚本 ， <code>systemd</code> 目录存放的多是配置文件</strong></li>
<li>centos 6 和 centos 7的区别</li>
</ul>
<h3 id="9-4-shell-脚本"><a href="#9-4-shell-脚本" class="headerlink" title="9.4 shell 脚本"></a>9.4 shell 脚本</h3><p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20210106/112456574.png" alt="mark"></p>
<ul>
<li><p>Shell 脚本（shell script），是一种为 shell 编写的脚本程序。</p>
</li>
<li><p><strong>业界所说的 shell 通常都是指 shell 脚本</strong>，但读者朋友要知道，<strong>shell 和 shell script 是两个不同的概念。</strong></p>
</li>
</ul>
<h4 id="1-第一个脚本程序"><a href="#1-第一个脚本程序" class="headerlink" title="1. 第一个脚本程序"></a>1. 第一个脚本程序</h4><p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20210106/113752836.png" alt="mark"></p>
<ul>
<li><strong>实现功能 ： 进入一个目录并查看目录下的内容</strong></li>
</ul>
<figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cd</span> /var/;ls;<span class="built_in">pwd</span>;du -sh *;du -sh</span><br></pre></td></tr></table></figure>

<ol>
<li><code>vim 1.sh</code></li>
</ol>
<figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cd</span> /var/</span><br><span class="line">ls</span><br><span class="line"><span class="built_in">pwd</span></span><br><span class="line">du -sh *</span><br><span class="line">du -sh</span><br></pre></td></tr></table></figure>

<ol start="2">
<li><p><strong>加上执行权限</strong> ： <code>chmod u+x 1.sh</code></p>
</li>
<li><p><strong>运行脚本</strong> ： <code>bash 1.sh</code></p>
<ul>
<li>使用bash shell 来执行</li>
</ul>
</li>
</ol>
<p><strong>注意：</strong></p>
<ul>
<li>如果对方默认的shell 不是 bash的话，需要在顶格加上声明</li>
</ul>
<figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">1 <span class="comment">#!/bin/bash</span></span><br><span class="line">2 <span class="built_in">cd</span> /var/</span><br><span class="line">3 ls</span><br><span class="line">4 <span class="built_in">pwd</span></span><br><span class="line">5 du -sh *</span><br><span class="line">6 du -sh</span><br></pre></td></tr></table></figure>

<ul>
<li><code>./1.sh</code> : 会用系统自带的shell 进行执行<ul>
<li>如果有注释，使用注释的shell进行执行</li>
</ul>
</li>
<li>注释使用 # ：注意顶格写</li>
</ul>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20210106/143301018.png" alt="mark"></p>
<h4 id="2-脚本的运行方式"><a href="#2-脚本的运行方式" class="headerlink" title="2. 脚本的运行方式"></a>2. 脚本的运行方式</h4><p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20210106/143405366.png" alt="mark"></p>
<ol>
<li><code>bash</code> 和 <code>./filename.sh</code>  ：<strong>会再新开一个bash子进程去执行</strong></li>
<li><code>source ./filename.sh</code> 和 <code>.filename.sh</code>  ： <strong>会使用当前的进程去执行</strong></li>
</ol>
<p><strong>举例子 ： 编写一个2.sh脚本</strong></p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">cd &#x2F;tmp</span><br><span class="line">pwd</span><br></pre></td></tr></table></figure>

<ol>
<li><code>bash 2.sh</code><ul>
<li>虽然没有赋予权限，但是执行完脚本，又回到了当前目录</li>
</ul>
</li>
<li><code>./2.sh</code><ul>
<li>会提示权限不够，必须添加<code>chmod u+x 2.sh</code></li>
<li>执行完脚本，又回到了当前目录</li>
</ul>
</li>
</ol>
<p><strong>以上两种方式因为是新的子进程，所以执行完对当前的环境是没有影响的</strong></p>
<hr>
<ol start="3">
<li><code>source ./2.sh</code><ul>
<li>当前的目录受到更改</li>
</ul>
</li>
<li><code>. 2.sh</code><ul>
<li>和 source 其实是同一个命令，当前目录受到更改</li>
</ul>
</li>
</ol>
<p><strong>注意 ：</strong></p>
<ul>
<li>如果想要脚本对当前的bash产生影响，使用<code>source ./</code> 或者 <code>.sh</code> </li>
<li>否则使用<code>./ sh</code> 方式去运行</li>
</ul>
<p><strong>内建命令和外部命令的区别</strong></p>
<ol>
<li><strong>上述cd 和pwd 命令属于内建命令，对当前的bash 会产生影响(因为不会产生子进程)</strong></li>
</ol>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20210106/145803219.png" alt="mark"></p>
<h3 id="9-5-管道和重定向"><a href="#9-5-管道和重定向" class="headerlink" title="9.5 管道和重定向"></a>9.5 管道和重定向</h3><p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20210106/150334158.png" alt="mark"></p>
<h4 id="1-管道"><a href="#1-管道" class="headerlink" title="1. 管道"></a>1. 管道</h4><p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20210107/104600913.png" alt="mark"></p>
<ul>
<li><strong>将多个进程的输入和输出连在一起</strong></li>
<li><strong>管道符 : <code>|</code></strong> <ul>
<li>代表的是<strong>匿名管道</strong></li>
</ul>
</li>
</ul>
<p><strong>举个例子</strong></p>
<ol>
<li><pre><code class="sh"><span class="comment"># 将前面cat的结果当做 | 后more的输入</span>
<span class="comment"># 这里实际和more+文件是一个效果</span>

cat /etc/dracut.conf | more
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line">2. &#96;cat | ps -f&#96;</span><br><span class="line"></span><br><span class="line">![mark](http:&#x2F;&#x2F;zhuuu-bucket.oss-cn-beijing.aliyuncs.com&#x2F;img&#x2F;20210107&#x2F;104957287.png)</span><br><span class="line"></span><br><span class="line">- **cat 和 ps 都是外部命令**</span><br><span class="line">  - bash 开了**两个子进程**来进行外部命令的程序</span><br><span class="line">  - &#96;20502&#96; 和 &#96;20503&#96; 是子进程</span><br><span class="line">  - 如下图，</span><br><span class="line">    - **cat输出**到管道 172657的管道</span><br><span class="line">    - **ps 的输入**就是管道 即172657的管道</span><br><span class="line"></span><br><span class="line">![mark](http:&#x2F;&#x2F;zhuuu-bucket.oss-cn-beijing.aliyuncs.com&#x2F;img&#x2F;20210107&#x2F;105316851.png)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">**注意 ： 两个概念问题**</span><br><span class="line"></span><br><span class="line">1. **子shell**</span><br><span class="line">   - 子进程是shell 的话就叫做子shell</span><br><span class="line">   - 管道符是可以创建子进程的</span><br><span class="line"></span><br><span class="line">2. **管道符如果使用内部命令**</span><br><span class="line">   - 作用范围只在那个脚本里面生效</span><br><span class="line">   - **避免在管道符中使用内部命令**</span><br><span class="line"></span><br><span class="line">&#96;&#96;&#96;sh</span><br><span class="line">[root@zhuuu &#x2F;]# cd &#x2F;etc&#x2F; | pwd</span><br><span class="line">&#x2F;</span><br></pre></td></tr></table></figure>


</code></pre>
</li>
</ol>
<h4 id="2-重定向"><a href="#2-重定向" class="headerlink" title="2. 重定向"></a>2. 重定向</h4><ul>
<li>大多数 UNIX 系统命令从你的终端接受输入并将所产生的输出发送回到您的终端。</li>
<li>一个命令通常从一个叫<strong>标准输入</strong>的地方<strong>读取输入</strong>，默认情况下，这恰好是你的终端。同样，一个命令通常将其输出<strong>写入到标准输出</strong>，默认情况下，这也是你的终端。</li>
<li><strong>本质 ： 利用文件代替终端进行输出/输入</strong></li>
</ul>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">需要注意的是文件描述符 fd</span><br><span class="line">0 通常是标准输入（STDIN），</span><br><span class="line">1 是标准输出（STDOUT），</span><br><span class="line">2 是标准错误输出（STDERR）。</span><br></pre></td></tr></table></figure>



<p><strong>重定向符号</strong></p>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20210107/113705152.png" alt="mark"></p>
<table>
<thead>
<tr>
<th align="left">命令</th>
<th align="left">说明</th>
</tr>
</thead>
<tbody><tr>
<td align="left">command &gt; file</td>
<td align="left">将输出重定向到 file。</td>
</tr>
<tr>
<td align="left">command &lt; file</td>
<td align="left">将输入重定向到 file。（会覆盖）</td>
</tr>
<tr>
<td align="left">command &gt;&gt; file</td>
<td align="left">将输出以追加的方式重定向到 file。（追加）</td>
</tr>
<tr>
<td align="left">command 2&gt; file</td>
<td align="left">将输出的错误重定向到文件file当中。</td>
</tr>
<tr>
<td align="left">command &amp;&gt; file</td>
<td align="left">将无论什么内容都重定向输入到文件flie中</td>
</tr>
<tr>
<td align="left">n &gt; file</td>
<td align="left">将文件描述符为 n 的文件重定向到 file。</td>
</tr>
<tr>
<td align="left">n &gt;&gt; file</td>
<td align="left">将文件描述符为 n 的文件以追加的方式重定向到 file。</td>
</tr>
<tr>
<td align="left">n &gt;&amp; m</td>
<td align="left">将输出文件 m 和 n 合并。</td>
</tr>
<tr>
<td align="left">n &lt;&amp; m</td>
<td align="left">将输入文件 m 和 n 合并。</td>
</tr>
<tr>
<td align="left">&lt;&lt; tag</td>
<td align="left">将开始标记 tag 和结束标记 tag 之间的内容作为输入。</td>
</tr>
</tbody></table>
<ol>
<li><strong>输入重定向</strong></li>
</ol>
<ul>
<li>和输出重定向一样，Unix 命令也可以从文件获取输入，语法为： </li>
</ul>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">command1 &lt; file1</span><br></pre></td></tr></table></figure>

<ul>
<li><p>这样，本来需要从键盘获取输入的命令会转移到文件读取内容。 </p>
</li>
<li><p>注意：输出重定向是大于号(&gt;)，输入重定向是小于号(&lt;)。  </p>
</li>
</ul>
<p><strong>举个例子</strong></p>
<ul>
<li>输出<code>/etc/passwd</code> 文件的行数</li>
</ul>
<figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">wc -l &lt; /etc/passwd</span><br></pre></td></tr></table></figure>



<ol start="2">
<li><strong>输出重定向</strong></li>
</ol>
<ul>
<li>重定向一般通过在命令间插入特定的符号来实现。特别的，这些符号的语法如下所示:</li>
</ul>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">command1 &gt; file1</span><br></pre></td></tr></table></figure>

<ul>
<li><p>上面这个命令执行command1然后将输出的内容存入file1。 </p>
</li>
<li><p>注意任何file1内的已经存在的内容将被新内容替代。</p>
</li>
<li><p>如果要将新内容添加在文件末尾，请使用&gt;&gt;操作符。</p>
</li>
</ul>
<p><strong>举个例子</strong></p>
<ul>
<li>输出123 到文件a.txt</li>
</ul>
<figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">echo</span> 123 &gt; a.txt</span><br></pre></td></tr></table></figure>

<ul>
<li>输出错误信息重定向到文件</li>
</ul>
<figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">nocmd 2&gt; c.txt</span><br></pre></td></tr></table></figure>

<ul>
<li>无论正确还是错误 全部重定向到文件当中</li>
</ul>
<figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">nocmd &amp;&gt; c.txt</span><br></pre></td></tr></table></figure>



<ol start="3">
<li><strong>输入输出重定向组合</strong><ul>
<li>一般用于配置文件生成 </li>
<li>也就是 <code>Here Document</code></li>
</ul>
</li>
</ol>
<ul>
<li><p><code>Here Document</code>是 Shell 中的一种特殊的重定向方式，用来将输入重定向到一个交互式 Shell 脚本或程序。</p>
</li>
<li><p><strong>它的基本的形式如下：</strong></p>
</li>
</ul>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">command &lt;&lt; delimiter</span><br><span class="line">    document</span><br><span class="line">delimiter</span><br></pre></td></tr></table></figure>

<ul>
<li><strong>它的作用是将两个 delimiter 之间的内容(document) 作为输入传递给 command。</strong></li>
</ul>
<p><strong>注意：</strong></p>
<ul>
<li>结尾的<code>delimiter</code> 一定要顶格写，前面不能有任何字符，后面也不能有任何字符，包括空格和 tab 缩进。</li>
<li>开始的<code>delimiter</code>前后的空格会被忽略掉。</li>
</ul>
<p><strong>举个例子</strong></p>
<ul>
<li>通过一个脚本文件生成另外一个脚本文件</li>
</ul>
<figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">vim 3.sh</span><br><span class="line"><span class="meta">#!/bin/bash</span></span><br><span class="line">cat &gt; /root/a.sh &lt;&lt;EOF           <span class="comment">#将cat的内容写入/root/a.sh 以EOF结尾</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">"hello bash"</span>				 <span class="comment">#这里的内容都是写入到a.sh的内容</span></span><br><span class="line">EOF								 <span class="comment">#结束输入</span></span><br></pre></td></tr></table></figure>

<ul>
<li><p>在命令行中通过 <strong>wc -l</strong> 命令计算 Here Document 的行数：</p>
<figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">$ wc -l &lt;&lt; EOF</span><br><span class="line">    欢迎来到</span><br><span class="line">    菜鸟教程</span><br><span class="line">    www.runoob.com</span><br><span class="line">EOF</span><br><span class="line">3          <span class="comment"># 输出结果为 3 行</span></span><br><span class="line">$</span><br></pre></td></tr></table></figure>



</li>
</ul>
<p>此处参考教程 ： <a href="https://www.runoob.com/linux/linux-shell-io-redirections.html" target="_blank" rel="noopener">https://www.runoob.com/linux/linux-shell-io-redirections.html</a></p>
<h3 id="9-6-变量"><a href="#9-6-变量" class="headerlink" title="9.6 变量"></a>9.6 变量</h3><p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20210107/143320855.png" alt="mark"></p>
<h4 id="1-变量的定义和赋值"><a href="#1-变量的定义和赋值" class="headerlink" title="1. 变量的定义和赋值"></a>1. 变量的定义和赋值</h4><p><strong>变量的定义</strong></p>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20210107/143424455.png" alt="mark"></p>
<p>注意，<strong>变量名和等号之间不能有空格</strong>，这可能和你熟悉的所有编程语言都不一样。同时，变量名的命名须遵循如下规则：</p>
<ul>
<li>命名只能使用英文字母，数字和下划线，首个字符不能以数字开头。</li>
<li>中间不能有空格，可以使用下划线（_）。</li>
<li>不能使用标点符号。</li>
<li>不能使用bash里的关键字（可用help命令查看保留关键字）。</li>
</ul>
<ol>
<li><strong>有效的 Shell 变量名示例如下：</strong></li>
</ol>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">RUNOOB</span><br><span class="line">LD_LIBRARY_PATH</span><br><span class="line">_var</span><br><span class="line">var2</span><br></pre></td></tr></table></figure>

<ol start="2">
<li><strong>无效的变量命名：</strong></li>
</ol>
<figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">?var=123</span><br><span class="line">user*name=runoob</span><br></pre></td></tr></table></figure>



<p><strong>变量的赋值</strong></p>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20210107/144631457.png" alt="mark"></p>
<ul>
<li><p><code>lect=$(ls -l /etc)</code></p>
<ul>
<li>将<code>ls -l /etc</code> 执行命令的结果赋值给<code>lect</code>这个变量</li>
<li>这样的好处是避免每次执行命令的开销</li>
<li>或者使用<code>ls -ls/etc</code></li>
</ul>
</li>
<li><p>带空格的变量需要用 “ “ 或者 ‘ ‘包含</p>
<ul>
<li><pre><code class="sh">[root@zhuuu ~]<span class="comment"># string1="hello bash"</span>
[root@zhuuu ~]<span class="comment"># echo $string1</span>
hello bash
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line">- &#96;&#96;&#96;sh</span><br><span class="line">  [root@zhuuu ~]# string2&#x3D;&#39;hello &quot;bash&quot;&#39;</span><br><span class="line">  [root@zhuuu ~]# echo $string2</span><br><span class="line">  hello &quot;bash&quot;</span><br></pre></td></tr></table></figure>


</code></pre>
</li>
</ul>
</li>
</ul>
<p><strong>变量的重新定义</strong></p>
<ul>
<li>已定义的变量，可以被重新定义，如：</li>
</ul>
<figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">your_name=<span class="string">"tom"</span></span><br><span class="line"><span class="built_in">echo</span> <span class="variable">$your_name</span></span><br><span class="line">your_name=<span class="string">"alibaba"</span></span><br><span class="line"><span class="built_in">echo</span> <span class="variable">$your_name</span></span><br></pre></td></tr></table></figure>

<ul>
<li>这样写是合法的，但注意，第二次赋值的时候不能写<code>$your_name=&quot;alibaba&quot;</code>，使用变量的时候才加美元符（$）。</li>
</ul>
<h4 id="2-变量的引用"><a href="#2-变量的引用" class="headerlink" title="2. 变量的引用"></a>2. 变量的引用</h4><p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20210107/145720522.png" alt="mark"></p>
<ul>
<li>使用一个定义过的变量，<strong>只要在变量名前面加美元符号即可</strong>，如：</li>
</ul>
<figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">your_name=<span class="string">"zhuuu"</span></span><br><span class="line"><span class="built_in">echo</span> <span class="variable">$your_name</span></span><br><span class="line"><span class="built_in">echo</span> <span class="variable">$&#123;your_name&#125;</span></span><br></pre></td></tr></table></figure>

<ul>
<li><p><strong>花括号的使用</strong></p>
<ul>
<li><p>变量名外面的花括号是可选的，加不加都行，加花括号是为了帮助解释器识别变量的边界，比如下面这种情况：</p>
</li>
<li><pre><code class="sh"><span class="keyword">for</span> skill <span class="keyword">in</span> Ada Coffe Action Java; <span class="keyword">do</span>
    <span class="built_in">echo</span> <span class="string">"I am good at <span class="variable">${skill}</span>Script"</span>
<span class="keyword">done</span>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line">  - 如果不给skill变量加花括号，写成&#96;echo &quot;I am good at $skillScript&quot;&#96;，解释器就会把&#96;$skillScript&#96;当成一个变量（其值为空），代码执行结果就不是我们期望的样子了。</span><br><span class="line"></span><br><span class="line">  - **推荐给所有变量加上花括号，这是个好的编程习惯。**</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">#### 3. 变量的作用范围</span><br><span class="line"></span><br><span class="line">![mark](http:&#x2F;&#x2F;zhuuu-bucket.oss-cn-beijing.aliyuncs.com&#x2F;img&#x2F;20210107&#x2F;150154856.png)</span><br><span class="line"></span><br><span class="line">运行shell时，会同时存在三种变量（默认是局部变量）：</span><br><span class="line"></span><br><span class="line">- **1) 局部变量**  : 局部变量在脚本或命令中定义，仅在当前shell实例中有效，其他shell启动的程序不能访问局部变量。</span><br><span class="line">- **2) 环境变量**  : 所有的程序，包括shell启动的程序，都能访问环境变量，有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。</span><br><span class="line">- **3) shell变量** : shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量，有一部分是局部变量，这些变量保证了shell的正常运行</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">**注意：**</span><br><span class="line"></span><br><span class="line">1. **变量默认的作用范围**</span><br><span class="line">   - 只对当前shell 有效</span><br><span class="line">   - 子进程bash获取不到父进程变量</span><br><span class="line">   - 父进程获取不到子进程变量</span><br><span class="line"></span><br><span class="line">**举个例子**</span><br><span class="line"></span><br><span class="line">- **子进程bash 获取不到父进程变量**</span><br><span class="line"></span><br><span class="line">&#96;&#96;&#96;sh</span><br><span class="line">[root@zhuuu ~]# a&#x3D;1</span><br><span class="line">[root@zhuuu ~]# bash</span><br><span class="line">[root@zhuuu ~]# echo $a</span><br><span class="line"></span><br><span class="line">[root@zhuuu ~]#</span><br></pre></td></tr></table></figure></code></pre>
</li>
</ul>
</li>
<li><p><strong>父进程获取不到子进程的变量</strong></p>
</li>
</ul>
<figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">[root@zhuuu ~]<span class="comment"># a=2</span></span><br><span class="line">[root@zhuuu ~]<span class="comment"># exit</span></span><br><span class="line"><span class="built_in">exit</span></span><br><span class="line">[root@zhuuu ~]<span class="comment"># echo $a</span></span><br><span class="line">1</span><br></pre></td></tr></table></figure>

<ul>
<li><strong>打开别的平行终端，变量也不会生效</strong></li>
</ul>
<ol start="2">
<li><strong>改变变量的默认作用范围</strong></li>
</ol>
<ul>
<li><strong>如运行： <code>bash xx.sh</code></strong>  <ul>
<li>那么 <code>xx.sh</code> 中的变量是属于子进程的 不会对当前生效的</li>
<li>若想生效，<code>xx.sh</code>的启动应该改为 <code>source xx.sh</code> 或者 <code>. sh</code></li>
</ul>
</li>
</ul>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20210107/151008175.png" alt="mark"></p>
<ul>
<li><strong>让子进程获取到父进程的变量</strong><ul>
<li><code>export 变量名</code> 后再使用</li>
<li>如下所示</li>
</ul>
</li>
</ul>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20210107/151145028.png" alt="mark"></p>
<ol start="3">
<li><strong>变量的删除</strong></li>
</ol>
<ul>
<li>使用 <code>unset</code> 命令可以删除变量。语法：</li>
</ul>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">unset variable_name</span><br></pre></td></tr></table></figure>

<ul>
<li><strong>变量被删除后不能再次使用。unset 命令不能删除只读变量。</strong></li>
</ul>
<p><strong>举个例子</strong></p>
<figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#!/bin/sh</span></span><br><span class="line">myUrl=<span class="string">"https://www.runoob.com"</span></span><br><span class="line"><span class="built_in">unset</span> myUrl</span><br><span class="line"><span class="built_in">echo</span> <span class="variable">$myUrl</span></span><br></pre></td></tr></table></figure>

<ul>
<li>以上实例执行将没有任何输出。</li>
</ul>
<h4 id="4-系统的环境变量"><a href="#4-系统的环境变量" class="headerlink" title="4. 系统的环境变量"></a>4. 系统的环境变量</h4><ul>
<li><strong>让每一个进程都能读取到变量的值</strong></li>
<li><strong>对于新的终端无效</strong></li>
<li><strong>对于当前终端和子shell 有效</strong></li>
</ul>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20210110/091118296.png" alt="mark"></p>
<ul>
<li><strong>系统环境变量</strong> ： <code>env | more</code><ul>
<li>默认都是大写的字母</li>
</ul>
</li>
</ul>
<ul>
<li><strong>查看当前变量</strong></li>
</ul>
<figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">[root@zhuuu ~]<span class="comment"># echo $USER</span></span><br><span class="line">root</span><br><span class="line">[root@zhuuu ~]<span class="comment"># echo $UID</span></span><br><span class="line">0</span><br></pre></td></tr></table></figure>

<ul>
<li><p><strong>命令搜索路线 ：</strong></p>
<ul>
<li><code>[root@zhuuu ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin</code></li>
</ul>
</li>
<li><p><strong>新增环境变量</strong></p>
<ul>
<li><code>PATH = PATH:/root</code> : 新增root目录的环境变量</li>
<li><code>echo $PATH</code></li>
<li><strong>并且新增的环境变量 对于 任何路径都适用</strong></li>
</ul>
</li>
</ul>
<h4 id="5-预定义变量"><a href="#5-预定义变量" class="headerlink" title="5. 预定义变量"></a>5. 预定义变量</h4><ul>
<li><strong>常用的有</strong><ul>
<li><code>echo $?</code> : 上一条命令是否正确执行<ul>
<li>0 表示上一条命令正确执行</li>
<li>1 表示上一条命令错误执行</li>
</ul>
</li>
<li><code>echo $0</code> ：当前的进程名称</li>
<li><code>echo $$</code> ： 显示当前进行的PID</li>
</ul>
</li>
</ul>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20210110/092403937.png" alt="mark"></p>
<p><strong>举个例子 ： 同时打印PID 和 Pname</strong></p>
<figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line">[root@zhuuu ~]<span class="comment"># PATH=$PATH:/root</span></span><br><span class="line">[root@zhuuu ~]<span class="comment"># vim 6.sh</span></span><br><span class="line">[root@zhuuu ~]<span class="comment"># 6.sh</span></span><br><span class="line">-bash: /root/6.sh: Permission denied</span><br><span class="line">[root@zhuuu ~]<span class="comment"># chmod u+x 6.sh </span></span><br><span class="line">[root@zhuuu ~]<span class="comment"># vim 6.sh</span></span><br><span class="line">[root@zhuuu ~]<span class="comment"># 6.sh</span></span><br><span class="line">23222</span><br><span class="line">/root/6.sh</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">#6.sh</span></span><br><span class="line">  1 <span class="comment">#!/bin/bash</span></span><br><span class="line">  2 </span><br><span class="line">  3 <span class="comment"># PID Pname</span></span><br><span class="line">  4 <span class="built_in">echo</span> $$</span><br><span class="line">  5 <span class="built_in">echo</span> <span class="variable">$0</span></span><br><span class="line">  </span><br><span class="line">  </span><br><span class="line">[root@zhuuu ~]<span class="comment"># . 6.sh</span></span><br><span class="line">20782</span><br><span class="line">-bash</span><br></pre></td></tr></table></figure>

<h4 id="6-位置变量"><a href="#6-位置变量" class="headerlink" title="6. 位置变量"></a>6. 位置变量</h4><ul>
<li><strong>为<code>shell</code>脚本添加更多的参数</strong></li>
<li>第 1 - 9 位置变量可以写 ： <code>$1-$9</code></li>
<li>第10个位置变量要写为 ： <code>${10}</code></li>
</ul>
<p><strong>脚本读取变量</strong></p>
<ol>
<li><code>vim 7.sh</code></li>
</ol>
<figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"> 1 <span class="comment">#!/bin/bash</span></span><br><span class="line"> 2 </span><br><span class="line"> 3 <span class="comment"># $1 $2 ... $9 $&#123;10&#125;</span></span><br><span class="line"> 4 </span><br><span class="line"> 5 pos1=<span class="variable">$1</span></span><br><span class="line"> 6 pos2=<span class="variable">$2</span></span><br><span class="line"> 7 </span><br><span class="line"> 8 </span><br><span class="line"> 9 <span class="built_in">echo</span> <span class="variable">$pos1</span></span><br><span class="line">10 <span class="built_in">echo</span> <span class="variable">$pos2</span></span><br></pre></td></tr></table></figure>

<ol start="2">
<li><strong>读取到变量</strong></li>
</ol>
<figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">[root@zhuuu ~]<span class="comment"># vim 7.sh</span></span><br><span class="line">[root@zhuuu ~]<span class="comment"># chmod u+x 7.sh</span></span><br><span class="line">[root@zhuuu ~]<span class="comment"># . 7.sh </span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">[root@zhuuu ~]<span class="comment"># . 7.sh -a -l</span></span><br><span class="line">-a</span><br><span class="line">-l</span><br></pre></td></tr></table></figure>

<ol start="3">
<li><code>7.sh</code> 可以直接修改为</li>
</ol>
<figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#!/bin/bash</span></span><br><span class="line"><span class="built_in">echo</span> <span class="variable">$1</span></span><br><span class="line"><span class="built_in">echo</span> <span class="variable">$2</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">[root@zhuuu ~]<span class="comment"># . 7.sh -a -l</span></span><br><span class="line">-a</span><br><span class="line">-l</span><br></pre></td></tr></table></figure>



<p><strong>注意：</strong></p>
<ul>
<li><strong>规避读取的值是空值 : 使用下划线替代</strong></li>
</ul>
<figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">echo</span> <span class="variable">$1</span></span><br><span class="line"><span class="built_in">echo</span> <span class="variable">$&#123;2&#125;</span>_</span><br></pre></td></tr></table></figure>

<figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"> 1 <span class="comment">#!/bin/bash</span></span><br><span class="line"> 2 </span><br><span class="line"> 3 <span class="comment"># $1 $2 ... $9 $&#123;10&#125;</span></span><br><span class="line"> 4 </span><br><span class="line"> 5 pos1=<span class="variable">$1</span></span><br><span class="line"> 6 pos2=<span class="variable">$&#123;2&#125;</span>_</span><br><span class="line"> 7 </span><br><span class="line"> 8 </span><br><span class="line"> 9 <span class="built_in">echo</span> <span class="variable">$pos1</span></span><br><span class="line">10 <span class="built_in">echo</span> <span class="variable">$pos2</span></span><br></pre></td></tr></table></figure>

<ul>
<li>*<em>参数替换 *</em><ul>
<li><strong>参数为空，赋值下划线</strong></li>
<li><strong>参数有值，赋值传入的参数</strong></li>
</ul>
</li>
</ul>
<figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"> 1 <span class="comment">#!/bin/bash</span></span><br><span class="line"> 2 </span><br><span class="line"> 3 <span class="comment"># $1 $2 ... $9 $&#123;10&#125;</span></span><br><span class="line"> 4 </span><br><span class="line"> 5 pos1=<span class="variable">$1</span></span><br><span class="line"> 6 pos2=<span class="variable">$&#123;2-_&#125;</span></span><br><span class="line"> 7 </span><br><span class="line"> 8 </span><br><span class="line"> 9 <span class="built_in">echo</span> <span class="variable">$pos1</span></span><br><span class="line">10 <span class="built_in">echo</span> <span class="variable">$pos2</span></span><br></pre></td></tr></table></figure>



<h4 id="7-环境变量的配置文件"><a href="#7-环境变量的配置文件" class="headerlink" title="7. 环境变量的配置文件"></a>7. 环境变量的配置文件</h4><p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20210110/110132186.png" alt="mark"></p>
<ul>
<li>保存在<code>/etc</code> 中的<strong>所有用户都能够访问</strong></li>
<li>保存在 <code>~</code>  之后的是<strong>用户的家目录</strong>（保存用户特有的配置）</li>
<li>永久添加环境变量 在上述任意配置文件添加即可</li>
</ul>
<ol>
<li><code>/etc/profile</code></li>
</ol>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20210110/110516452.png" alt="mark"></p>
<ol start="2">
<li><code>/etc/bashrc</code></li>
</ol>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20210110/110559504.png" alt="mark"></p>
<ol start="3">
<li><code>.bashrc</code></li>
</ol>
<ul>
<li>用户目录下的bashrc</li>
</ul>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20210110/110651001.png" alt="mark"></p>
<ol start="4">
<li><code>.bash_profile</code></li>
</ol>
<ul>
<li>用户目录下的bash_profile</li>
</ul>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20210110/110908090.png" alt="mark"></p>
<ol start="5">
<li><strong>目录</strong> ： <code>/etc/profile.d</code></li>
</ol>
<figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">[root@zhuuu ~]<span class="comment"># ls /etc/profile.d/</span></span><br><span class="line">256term.csh                   bash_completion.sh  colorls.csh  lang.csh  less.sh   vim.sh</span><br><span class="line">256term.sh                    colorgrep.csh       colorls.sh   lang.sh   sh.local  which2.csh</span><br><span class="line">abrt-console-notification.sh  colorgrep.sh        csh.local    less.csh  vim.csh   which2.sh</span><br></pre></td></tr></table></figure>



<p><strong>注意：环境变量执行顺序问题</strong></p>
<ul>
<li><p><strong>配置文件是在每次打开终端的时候才会去运行</strong></p>
</li>
<li><p><strong>定义环境变量可以在上述任意一个文件中定义</strong></p>
</li>
<li><p><strong>当有重复的变量的时候，后面的变量会替换掉前面的变量</strong></p>
</li>
<li><p><strong>使用loginshell 和 nologinshell 的区别</strong></p>
<ul>
<li><strong>nologinshell 配置加载时不完全的</strong></li>
<li><code>nologinshell</code>配置环境与 正常登陆环境是不同的</li>
<li><code>su - 用户名</code> ：<code>loginshell</code></li>
<li><code>su 用户名</code> : <code>nologinshell</code></li>
</ul>
</li>
</ul>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20210110/111202969.png" alt="mark"></p>
<figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 顺序</span></span><br><span class="line">/etc/profile</span><br><span class="line">.bash_profile</span><br><span class="line">.bashrc</span><br><span class="line">/etc/bashrc</span><br><span class="line"></span><br><span class="line"><span class="built_in">export</span> PATH=<span class="variable">$PATH</span>:/new/path 让自己进程和子进程都能够使用</span><br></pre></td></tr></table></figure>

<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20210110/111429054.png" alt="mark"></p>
<ul>
<li><p><strong>新添加的环境变量是不会立即生效的</strong></p>
<ul>
<li>添加生效的方法 <ul>
<li>关掉终端重新打开</li>
<li><code>source 配置文件</code> ：<code>source /etc/bashrc</code></li>
</ul>
</li>
</ul>
</li>
<li><p>建议使用<code>su -用户名</code> 登陆</p>
</li>
</ul>
<h3 id="9-7-数组"><a href="#9-7-数组" class="headerlink" title="9.7 数组"></a>9.7 数组</h3><ul>
<li><strong>Bash Shell 只支持一维数组（不支持多维数组），初始化时不需要定义数组大小</strong>（与 PHP 类似）</li>
<li>与大部分编程语言类似，<strong>数组元素的下标由0开始。</strong>数组中可以存放多个值。</li>
<li>Shell 数组用括号来表示，元素用”空格”符号分割开</li>
</ul>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20210110/112915023.png" alt="mark">欧陆</p>
<p>语法格式如下：</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">array_name&#x3D;(value1 value2 ... valuen)</span><br></pre></td></tr></table></figure>



<p><strong>定义数组</strong></p>
<figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">my_array=(A B <span class="string">"C"</span> D)</span><br><span class="line"></span><br><span class="line"><span class="comment">#我们也可以使用下标来定义数组:</span></span><br><span class="line">array_name[0]=value0</span><br><span class="line">array_name[1]=value1</span><br><span class="line">array_name[2]=value2</span><br></pre></td></tr></table></figure>

<ol>
<li><strong>读取数组的元素</strong></li>
</ol>
<figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">my_array=(A B <span class="string">"C"</span> D)</span><br><span class="line"></span><br><span class="line"><span class="built_in">echo</span> <span class="string">"第一个元素为: <span class="variable">$&#123;my_array[0]&#125;</span>"</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">"第二个元素为: <span class="variable">$&#123;my_array[1]&#125;</span>"</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">"第三个元素为: <span class="variable">$&#123;my_array[2]&#125;</span>"</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">"第四个元素为: <span class="variable">$&#123;my_array[3]&#125;</span>"</span></span><br></pre></td></tr></table></figure>

<p>执行脚本，输出结果如下所示：</p>
<figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">$ chmod +x test.sh </span><br><span class="line">$ ./test.sh</span><br><span class="line">第一个元素为: A</span><br><span class="line">第二个元素为: B</span><br><span class="line">第三个元素为: C</span><br><span class="line">第四个元素为: D</span><br></pre></td></tr></table></figure>



<ol start="2">
<li><strong>获取数组中的所有元素</strong></li>
</ol>
<ul>
<li><strong>使用@ 或 * 可以获取数组中的所有元素</strong>，例如：</li>
</ul>
<figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">my_array[0]=A</span><br><span class="line">my_array[1]=B</span><br><span class="line">my_array[2]=C</span><br><span class="line">my_array[3]=D</span><br><span class="line"></span><br><span class="line"><span class="built_in">echo</span> <span class="string">"数组的元素为: <span class="variable">$&#123;my_array[*]&#125;</span>"</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">"数组的元素为: <span class="variable">$&#123;my_array[@]&#125;</span>"</span></span><br></pre></td></tr></table></figure>

<p>执行脚本，输出结果如下所示：</p>
<figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">$ chmod +x test.sh </span><br><span class="line">$ ./test.sh</span><br><span class="line">数组的元素为: A B C D</span><br><span class="line">数组的元素为: A B C D</span><br></pre></td></tr></table></figure>



<ol start="3">
<li><strong>获取数组的长度</strong></li>
</ol>
<figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">- 获取数组长度的方法与获取字符串长度的方法相同，例如：</span><br><span class="line"></span><br><span class="line">my_array[0]=A</span><br><span class="line">my_array[1]=B</span><br><span class="line">my_array[2]=C</span><br><span class="line">my_array[3]=D</span><br><span class="line"></span><br><span class="line"><span class="built_in">echo</span> <span class="string">"数组元素个数为: <span class="variable">$&#123;#my_array[*]&#125;</span>"</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">"数组元素个数为: <span class="variable">$&#123;#my_array[@]&#125;</span>"</span></span><br></pre></td></tr></table></figure>

<p>执行脚本，输出结果如下所示：</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">$ chmod +x test.sh </span><br><span class="line">$ .&#x2F;test.sh</span><br><span class="line">数组元素个数为: 4</span><br><span class="line">数组元素个数为: 4</span><br></pre></td></tr></table></figure>



<h3 id="9-8-转义和引用"><a href="#9-8-转义和引用" class="headerlink" title="9.8 转义和引用"></a>9.8 转义和引用</h3><h4 id="1-特殊字符"><a href="#1-特殊字符" class="headerlink" title="1. 特殊字符"></a>1. 特殊字符</h4><p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20210113/165126029.png" alt="mark"></p>
<ul>
<li><code>#</code>  ： 注释</li>
<li><code>;</code>   :   连接两条命令或者两个脚本</li>
<li><code>\</code>   :   可以转义两类符号<ul>
<li>字母 ： 转换成特殊的功能(如 ： <code>\n \r \t</code>)</li>
<li>非字母 ：显示特殊字符（如<code>\$ \&quot; \\</code>）</li>
</ul>
</li>
</ul>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20210113/165437455.png" alt="mark"></p>
<ol>
<li><strong>转义符号</strong></li>
</ol>
<figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">[root@zhuuu ~]<span class="comment"># echo "$a"</span></span><br><span class="line"></span><br><span class="line">[root@zhuuu ~]<span class="comment"># echo "\$a"</span></span><br><span class="line"><span class="variable">$a</span></span><br><span class="line"></span><br><span class="line">[root@zhuuu ~]<span class="comment"># echo "  abc"x"edf " </span></span><br><span class="line">  abcxedf </span><br><span class="line">[root@zhuuu ~]<span class="comment"># echo "  abc\"x\"edf " </span></span><br><span class="line">  abc<span class="string">"x"</span>edf</span><br></pre></td></tr></table></figure>



<h4 id="2-引用"><a href="#2-引用" class="headerlink" title="2. 引用"></a>2. 引用</h4><p><code>&quot;&quot; 和 &#39;&#39;</code>  对变量的影响</p>
<ul>
<li><strong>双引号和单引号 对于变量的不同</strong><ul>
<li><strong>双引号 ： 不完全引用</strong><ul>
<li><strong>如果里面是变量就引用变量的值</strong></li>
</ul>
</li>
<li><strong>单引号 ： 完全引用</strong><ul>
<li><strong>里面是什么就显示什么的值</strong></li>
</ul>
</li>
</ul>
</li>
<li><strong>反引号 : `</strong> ： 对于命令的引用</li>
</ul>
<h3 id="9-9-运算符"><a href="#9-9-运算符" class="headerlink" title="9.9 运算符"></a>9.9 运算符</h3><p>Shell 和其他编程语言一样，支持多种运算符，包括：</p>
<ul>
<li><strong>算数运算符（只支持整数的运算）</strong></li>
<li><strong>关系运算符</strong></li>
<li><strong>布尔运算符</strong></li>
<li><strong>字符串运算符</strong></li>
<li><strong>文件测试运算符</strong></li>
</ul>
<h4 id="1-算术运算符"><a href="#1-算术运算符" class="headerlink" title="1. 算术运算符"></a>1. 算术运算符</h4><p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20210113/171558335.png" alt="mark"></p>
<p>注意 ： </p>
<ul>
<li><p>原生bash不支持简单的数学运算，但是可以通过其他命令来实现，例如 awk 和 expr，expr 最常用。 </p>
</li>
<li><p><strong>expr 是一款表达式计算工具，使用它能完成表达式的求值操作。</strong></p>
</li>
<li><p><strong><code>expr</code> 只支持整数，不支持小数和浮点数</strong></p>
</li>
</ul>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20210113/172204132.png" alt="mark"></p>
<p><strong>下表列出了常用的算术运算符，假定变量 a 为 10，变量 b 为 20：</strong></p>
<table>
<thead>
<tr>
<th align="left">运算符</th>
<th align="left">说明</th>
<th align="left">举例</th>
</tr>
</thead>
<tbody><tr>
<td align="left">+</td>
<td align="left">加法</td>
<td align="left"><code>expr $a + $b</code> 结果为 30。</td>
</tr>
<tr>
<td align="left">-</td>
<td align="left">减法</td>
<td align="left"><code>expr $a - $b</code> 结果为 -10。</td>
</tr>
<tr>
<td align="left">*</td>
<td align="left">乘法</td>
<td align="left"><code>expr $a \* $b</code> 结果为  200。</td>
</tr>
<tr>
<td align="left">/</td>
<td align="left">除法</td>
<td align="left"><code>expr $b / $a</code> 结果为 2。</td>
</tr>
<tr>
<td align="left">%</td>
<td align="left">取余</td>
<td align="left"><code>expr $b % $a</code> 结果为 0。</td>
</tr>
<tr>
<td align="left">=</td>
<td align="left">赋值</td>
<td align="left">a=$b 将把变量 b 的值赋给 a。</td>
</tr>
</tbody></table>
<p><strong>例子1 ：</strong></p>
<figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#!/bin/bash</span></span><br><span class="line"></span><br><span class="line">val=`expr 2 + 2`</span><br><span class="line"><span class="built_in">echo</span> <span class="string">"两数之和为 : <span class="variable">$val</span>"</span></span><br></pre></td></tr></table></figure>

<p><strong>执行脚本，输出结果如下所示：</strong></p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">两数之和为 : 4</span><br></pre></td></tr></table></figure>

<hr>
<p>两点注意：</p>
<ul>
<li><strong>表达式和运算符之间要有空格</strong>，例如<code>2+2</code> 是不对的，必须写成 <code>2 + 2</code>，这与我们熟悉的大多数编程语言不一样。</li>
<li><strong>完整的表达式要被 `` 包含</strong>，注意这个字符不是常用的单引号，在 Esc 键下边。</li>
<li>例如，两个数相加  *<em>注意使用的是反引号 `  而不是单引号 ‘ *</em></li>
</ul>
<h4 id="2-数字常量（整数运算）"><a href="#2-数字常量（整数运算）" class="headerlink" title="2. 数字常量（整数运算）"></a>2. 数字常量（整数运算）</h4><p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20210113/171909212.png" alt="mark"></p>
<ul>
<li>let 命令很少用</li>
<li>let 命令简化  ： 双圆括号</li>
</ul>
<figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">自加操作：<span class="built_in">let</span> no++</span><br><span class="line"></span><br><span class="line">自减操作：<span class="built_in">let</span> no--</span><br><span class="line"></span><br><span class="line">简写形式 <span class="built_in">let</span> no+=10，<span class="built_in">let</span> no-=20，分别等同于 <span class="built_in">let</span> no=no+10，<span class="built_in">let</span> no=no-20。</span><br></pre></td></tr></table></figure>



<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20210113/172012920.png" alt="mark"></p>
<p><strong>示例：</strong></p>
<figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 使用双圆括号</span></span><br><span class="line">[root@zhuuu ~]<span class="comment"># (( a=4+5 ))</span></span><br><span class="line">[root@zhuuu ~]<span class="comment"># echo $a</span></span><br><span class="line">9</span><br><span class="line"></span><br><span class="line"><span class="comment"># 单独使用运算法 ： 返回字符串的结果</span></span><br><span class="line">[root@zhuuu ~]<span class="comment"># b=4+5</span></span><br><span class="line">[root@zhuuu ~]<span class="comment"># echo $b</span></span><br><span class="line">4+5</span><br><span class="line"></span><br><span class="line"><span class="comment"># ++ 功能 -- 功能</span></span><br><span class="line">[root@zhuuu ~]<span class="comment"># (( a++ ))</span></span><br><span class="line">[root@zhuuu ~]<span class="comment"># echo $a</span></span><br><span class="line">10</span><br></pre></td></tr></table></figure>



<h4 id="3-测试（test）"><a href="#3-测试（test）" class="headerlink" title="3. 测试（test）"></a>3. 测试（test）</h4><p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20210113/193948900.png" alt="mark"></p>
<ul>
<li><strong>shell 中 exit 作用</strong></li>
</ul>
<ol>
<li>作用一 ： 返回上面出错</li>
</ol>
<figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">[root@zhuuu ~]<span class="comment"># vim 8.sh</span></span><br><span class="line">[root@zhuuu ~]<span class="comment"># bash 8.sh</span></span><br><span class="line">8.sh: line 5: ppwd: <span class="built_in">command</span> not found</span><br><span class="line">[root@zhuuu ~]<span class="comment"># echo $?</span></span><br><span class="line">127</span><br><span class="line"></span><br><span class="line">8.sh</span><br><span class="line">  1 <span class="comment">#!/bin/bash</span></span><br><span class="line">  2 </span><br><span class="line">  3 <span class="comment">#exit demo</span></span><br><span class="line">  4 </span><br><span class="line">  5 ppwd</span><br><span class="line">  6 <span class="built_in">exit</span></span><br></pre></td></tr></table></figure>



<ol start="2">
<li>作用于 ： 自定义错误返回值</li>
</ol>
<figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">8.sh</span><br><span class="line">  1 <span class="comment">#!/bin/bash</span></span><br><span class="line">  2 </span><br><span class="line">  3 <span class="comment">#exit demo</span></span><br><span class="line">  4 </span><br><span class="line">  5 <span class="built_in">pwd</span></span><br><span class="line">  6 <span class="built_in">exit</span> 127</span><br></pre></td></tr></table></figure>



<hr>
<ul>
<li><strong>测试命令 ： test</strong></li>
</ul>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20210113/194312145.png" alt="mark"></p>
<p><strong>注意：</strong></p>
<ul>
<li><strong>在shell 中</strong> <ul>
<li>0 为 True</li>
<li>1 为 False</li>
</ul>
</li>
</ul>
<ol>
<li><strong>字符串测试</strong></li>
</ol>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20210113/194620798.png" alt="mark"></p>
<figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 字符串比较是区分大小写的</span></span><br><span class="line">[root@zhuuu ~]<span class="comment"># [ "abc" = "ABC" ]</span></span><br><span class="line">[root@zhuuu ~]<span class="comment"># echo $?</span></span><br><span class="line">1</span><br><span class="line">[root@zhuuu ~]<span class="comment"># [ "abc" = "abc" ]</span></span><br><span class="line">[root@zhuuu ~]<span class="comment"># echo $?</span></span><br><span class="line">0</span><br><span class="line"></span><br><span class="line"><span class="comment"># 完整版如下</span></span><br><span class="line">[root@zhuuu ~]<span class="comment"># test "abc" = "ABC"</span></span><br><span class="line">[root@zhuuu ~]<span class="comment"># echo $?</span></span><br><span class="line">1</span><br></pre></td></tr></table></figure>







<ol start="2">
<li><strong>整数测试</strong></li>
</ol>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20210113/194650703.png" alt="mark"></p>
<figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 判断 5 &gt; 4？</span></span><br><span class="line">[root@zhuuu ~]<span class="comment"># [ 5 -gt 4 ]</span></span><br><span class="line">[root@zhuuu ~]<span class="comment"># echo $?</span></span><br><span class="line">0</span><br><span class="line">[root@zhuuu ~]<span class="comment"># [ 5 &gt; 4 ]         注意 ： 这种写法是不对的 因为[]是不支持大于小于号的</span></span><br><span class="line">[root@zhuuu ~]<span class="comment"># echo $?				</span></span><br><span class="line">0</span><br><span class="line">[root@zhuuu ~]<span class="comment"># [[ 5 &gt; 4 ]]</span></span><br><span class="line">[root@zhuuu ~]<span class="comment"># echo $?</span></span><br><span class="line">0</span><br><span class="line"></span><br><span class="line"><span class="comment"># 常见的大小比较</span></span><br><span class="line">-gt 大于</span><br><span class="line">-lt 小于</span><br><span class="line">-eq 相等</span><br><span class="line">-ge 大于等于</span><br><span class="line">-le 小于等于</span><br></pre></td></tr></table></figure>



<ol start="3">
<li><strong>文件测试</strong></li>
</ol>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20210113/194750452.png" alt="mark"></p>
<figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 判断文件是否存在</span></span><br><span class="line">[root@zhuuu ~]<span class="comment"># test -f /etc/passwd</span></span><br><span class="line">[root@zhuuu ~]<span class="comment"># echo $?</span></span><br><span class="line">0</span><br><span class="line">[root@zhuuu ~]<span class="comment"># test -f /etc/passwd2</span></span><br><span class="line">[root@zhuuu ~]<span class="comment"># echo $?</span></span><br><span class="line">1</span><br><span class="line"></span><br><span class="line"><span class="comment"># 使用括号写法</span></span><br><span class="line">[root@zhuuu ~]<span class="comment"># [ -d /etc/ ]</span></span><br><span class="line">[root@zhuuu ~]<span class="comment"># echo $?</span></span><br><span class="line">0</span><br><span class="line">[root@zhuuu ~]<span class="comment"># [ -e /etc/ ]</span></span><br><span class="line">[root@zhuuu ~]<span class="comment"># echo $?</span></span><br><span class="line">0</span><br></pre></td></tr></table></figure>









<h4 id="4-特殊符号大全"><a href="#4-特殊符号大全" class="headerlink" title="4. 特殊符号大全"></a>4. 特殊符号大全</h4><p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20210113/172917544.png" alt="mark"></p>
<ol>
<li><strong>引号</strong><ul>
<li>完全引用 ： 单引号</li>
<li>不完全引用：双引号</li>
<li>执行命令 ： 反引号</li>
</ul>
</li>
</ol>
<ol start="2">
<li><strong>括号</strong></li>
</ol>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20210113/193300995.png" alt="mark"></p>
<ul>
<li>圆括号（） ： 单独使用产生一个子shell</li>
<li>方括号   [ ]   :    test命令</li>
<li>尖括号   &lt;&gt;   :   输入输出重定向</li>
<li>花括号   ｛｝： 输出范围</li>
</ul>
<p>举例子：</p>
<ol>
<li>圆括号</li>
</ol>
<h3 id="9-10-if-语句"><a href="#9-10-if-语句" class="headerlink" title="9.10 if 语句"></a>9.10 if 语句</h3><p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20210122/110459406.png" alt="mark"></p>
<h4 id="1-if-语句"><a href="#1-if-语句" class="headerlink" title="1. if 语句"></a>1. if 语句</h4><ul>
<li><strong>if 语句语法格式：</strong> </li>
</ul>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">if condition</span><br><span class="line">then</span><br><span class="line">    command1 </span><br><span class="line">    command2</span><br><span class="line">    ...</span><br><span class="line">    commandN </span><br><span class="line">fi</span><br></pre></td></tr></table></figure>

<p><strong>写成一行（适用于终端命令提示符）：</strong></p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">if [ $(ps -ef | grep -c &quot;ssh&quot;) -gt 1 ]; then echo &quot;true&quot;; fi</span><br></pre></td></tr></table></figure>

<p><strong>末尾的fi就是if倒过来拼写，后面还会遇到类似的。</strong></p>
<p><strong>举个例子</strong></p>
<ol>
<li>判断当前用户是否是root</li>
</ol>
<figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">[root@zhuuu ~]<span class="comment"># [ $UID = 0 ]</span></span><br><span class="line">[root@zhuuu ~]<span class="comment"># echo $?</span></span><br><span class="line">0</span><br><span class="line">[root@zhuuu ~]<span class="comment"># [ $USER = root ]</span></span><br><span class="line">[root@zhuuu ~]<span class="comment"># echo $?</span></span><br><span class="line">0</span><br><span class="line">[root@zhuuu ~]<span class="comment"># if [ $UID = 0 ]</span></span><br><span class="line">&gt; <span class="keyword">then</span></span><br><span class="line">&gt; <span class="built_in">echo</span> <span class="string">"root user"</span></span><br><span class="line">&gt; <span class="keyword">fi</span></span><br><span class="line">root user</span><br></pre></td></tr></table></figure>



<h4 id="2-if-else-语句"><a href="#2-if-else-语句" class="headerlink" title="2. if-else 语句"></a>2. if-else 语句</h4><ul>
<li><strong>if else 语法格式：</strong></li>
</ul>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">if condition</span><br><span class="line">then</span><br><span class="line">    command1 </span><br><span class="line">    command2</span><br><span class="line">    ...</span><br><span class="line">    commandN</span><br><span class="line">else</span><br><span class="line">    command</span><br><span class="line">fi</span><br></pre></td></tr></table></figure>



<p><strong>举个例子</strong></p>
<ol>
<li>判断当前用户是否是root</li>
</ol>
<figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">[user4@zhuuu ~]$ vim 9.sh</span><br><span class="line">[user4@zhuuu ~]$ . 9.sh </span><br><span class="line">otheruser</span><br><span class="line"></span><br><span class="line">  1 <span class="comment">#!/bin/bash</span></span><br><span class="line">  2 </span><br><span class="line">  3 <span class="comment">#if-else</span></span><br><span class="line">  4 </span><br><span class="line">  5 <span class="keyword">if</span> [ <span class="variable">$USER</span> = root ]  ;<span class="keyword">then</span></span><br><span class="line">  6         <span class="built_in">echo</span> <span class="string">"rootuser"</span></span><br><span class="line">  7 <span class="keyword">else</span></span><br><span class="line">  8         <span class="built_in">echo</span> <span class="string">"otheruser"</span></span><br><span class="line">  9 <span class="keyword">fi</span></span><br></pre></td></tr></table></figure>





<h4 id="3-if-elif-else-语句"><a href="#3-if-elif-else-语句" class="headerlink" title="3. if - elif - else 语句"></a>3. if - elif - else 语句</h4><p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20210122/195534658.png" alt="mark"></p>
<p><strong>以下实例判断两个变量是否相等：</strong></p>
<figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">a=10</span><br><span class="line">b=20</span><br><span class="line"><span class="keyword">if</span> [ <span class="variable">$a</span> == <span class="variable">$b</span> ]</span><br><span class="line"><span class="keyword">then</span></span><br><span class="line">   <span class="built_in">echo</span> <span class="string">"a 等于 b"</span></span><br><span class="line"><span class="keyword">elif</span> [ <span class="variable">$a</span> -gt <span class="variable">$b</span> ]</span><br><span class="line"><span class="keyword">then</span></span><br><span class="line">   <span class="built_in">echo</span> <span class="string">"a 大于 b"</span></span><br><span class="line"><span class="keyword">elif</span> [ <span class="variable">$a</span> -lt <span class="variable">$b</span> ]</span><br><span class="line"><span class="keyword">then</span></span><br><span class="line">   <span class="built_in">echo</span> <span class="string">"a 小于 b"</span></span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">   <span class="built_in">echo</span> <span class="string">"没有符合的条件"</span></span><br><span class="line"><span class="keyword">fi</span></span><br></pre></td></tr></table></figure>

<p>输出结果：</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">a 小于 b</span><br></pre></td></tr></table></figure>



<p><strong>注意 ：</strong> </p>
<ul>
<li><strong>if else 语句经常与 test 命令结合使用</strong>，如下所示： </li>
</ul>
<figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">[user4@zhuuu /]$ num1=$[2*3]</span><br><span class="line">[user4@zhuuu /]$ num2=$[1+5]</span><br><span class="line">[user4@zhuuu /]$ <span class="keyword">if</span> <span class="built_in">test</span> $[num1] -eq $[num2]</span><br><span class="line">&gt; <span class="keyword">then</span></span><br><span class="line">&gt; <span class="built_in">echo</span> <span class="string">"两个数字相等"</span></span><br><span class="line">&gt; <span class="keyword">else</span></span><br><span class="line">&gt; <span class="built_in">echo</span> <span class="string">"两个数字不相等"</span></span><br><span class="line">&gt; <span class="keyword">fi</span></span><br><span class="line">两个数字相等</span><br></pre></td></tr></table></figure>



<h4 id="4-嵌套-if"><a href="#4-嵌套-if" class="headerlink" title="4. 嵌套 if"></a>4. 嵌套 if</h4><p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20210122/200334773.png" alt="mark"></p>
<h3 id="9-11-case-语句"><a href="#9-11-case-语句" class="headerlink" title="9.11 case 语句"></a>9.11 case 语句</h3><ul>
<li>多分支<code>if</code> 使用 case 更加方便</li>
<li><strong>Shell case语句为多选择语句。</strong></li>
<li><strong>可以用case语句匹配一个值与一个模式，如果匹配成功，执行相匹配的命令。</strong></li>
</ul>
<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20210122/201059890.png" alt="mark"></p>
<ul>
<li>case语句格式如下：</li>
</ul>
<figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">case</span> 值 <span class="keyword">in</span></span><br><span class="line">模式1)</span><br><span class="line">    command1</span><br><span class="line">    command2</span><br><span class="line">    ...</span><br><span class="line">    commandN</span><br><span class="line">    ;;</span><br><span class="line">模式2）</span><br><span class="line">    command1</span><br><span class="line">    command2</span><br><span class="line">    ...</span><br><span class="line">    commandN</span><br><span class="line">    ;;</span><br><span class="line"><span class="keyword">esac</span></span><br></pre></td></tr></table></figure>



<p><strong>举个例子</strong></p>
<ul>
<li>实现一个可以同时控制脚本<code>start stop restart  的 script</code></li>
</ul>
<figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line">[root@zhuuu ~]<span class="comment"># vim 12.sh</span></span><br><span class="line">[root@zhuuu ~]<span class="comment"># ./12.sh start</span></span><br><span class="line">./12.sh start....</span><br><span class="line"></span><br><span class="line">  1 <span class="comment">#!/bin/bash</span></span><br><span class="line">  2 </span><br><span class="line">  3 <span class="comment"># case demo</span></span><br><span class="line">  4 </span><br><span class="line">  5 <span class="keyword">case</span> <span class="string">"<span class="variable">$1</span>"</span> <span class="keyword">in</span></span><br><span class="line">  6         <span class="string">"start"</span>|<span class="string">"START"</span>)</span><br><span class="line">  7         <span class="built_in">echo</span> <span class="variable">$0</span> start....</span><br><span class="line">  8         ;;</span><br><span class="line">  9         <span class="string">"stop"</span>|<span class="string">"STOP"</span>)</span><br><span class="line"> 10         <span class="built_in">echo</span> <span class="variable">$0</span> stop...</span><br><span class="line"> 11         ;;</span><br><span class="line"> 12         <span class="string">"restart"</span>|<span class="string">"RESTART"</span>)</span><br><span class="line"> 13         <span class="built_in">echo</span> <span class="variable">$0</span> restart</span><br><span class="line"> 14         ;;</span><br><span class="line"> 15         *)</span><br><span class="line"> 16         <span class="built_in">echo</span> <span class="string">"Usage : <span class="variable">$0</span> &#123;start|stop|restart&#125;"</span></span><br><span class="line"> 17         ;;</span><br><span class="line"> 18 <span class="keyword">esac</span></span><br></pre></td></tr></table></figure>

<ul>
<li><strong>case工作方式如上所示。取值后面必须为单词in，每一模式必须以右括号结束。</strong></li>
<li><strong>取值可以为变量或常数</strong>。匹配发现取值符合某一模式后，其间所有命令开始执行直至<code>;;</code></li>
<li>取值将检测匹配的每一个模式。<strong>一旦模式匹配，则执行完匹配模式相应命令后不再继续其他模式。</strong></li>
<li><strong>如果无一匹配模式，使用星号 * 捕获该值，再执行后面的命令。</strong></li>
</ul>
<p><strong>下面的脚本提示输入1到4，与每一种模式进行匹配：</strong></p>
<figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">echo</span> <span class="string">'输入 1 到 4 之间的数字:'</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">'你输入的数字为:'</span></span><br><span class="line"><span class="built_in">read</span> aNum</span><br><span class="line"><span class="keyword">case</span> <span class="variable">$aNum</span> <span class="keyword">in</span></span><br><span class="line">    1)  <span class="built_in">echo</span> <span class="string">'你选择了 1'</span></span><br><span class="line">    ;;</span><br><span class="line">    2)  <span class="built_in">echo</span> <span class="string">'你选择了 2'</span></span><br><span class="line">    ;;</span><br><span class="line">    3)  <span class="built_in">echo</span> <span class="string">'你选择了 3'</span></span><br><span class="line">    ;;</span><br><span class="line">    4)  <span class="built_in">echo</span> <span class="string">'你选择了 4'</span></span><br><span class="line">    ;;</span><br><span class="line">    *)  <span class="built_in">echo</span> <span class="string">'你没有输入 1 到 4 之间的数字'</span></span><br><span class="line">    ;;</span><br><span class="line"><span class="keyword">esac</span></span><br></pre></td></tr></table></figure>



<h3 id="9-12-循环"><a href="#9-12-循环" class="headerlink" title="9.12 循环"></a>9.12 循环</h3><p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20210123/093449465.png" alt="mark"></p>
<h4 id="1-for-循环"><a href="#1-for-循环" class="headerlink" title="1. for 循环"></a>1. for 循环</h4><p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20210123/093605340.png" alt="mark"></p>
<ul>
<li><strong>for循环一般格式为（python 风格）：</strong></li>
</ul>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">for</span> var <span class="keyword">in</span> item1 item2 ... itemN</span><br><span class="line"><span class="keyword">do</span></span><br><span class="line">    command1</span><br><span class="line">    command2</span><br><span class="line">    ...</span><br><span class="line">    commandN</span><br><span class="line"><span class="keyword">done</span></span><br></pre></td></tr></table></figure>

<ul>
<li>写成一行：</li>
</ul>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">for</span> var <span class="keyword">in</span> item1 item2 ... itemN; <span class="keyword">do</span> command1; command2… <span class="keyword">done</span>;</span><br></pre></td></tr></table></figure>



<ul>
<li>简单举例子 ： 打印1-9</li>
</ul>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line">[root@zhuuu mail]<span class="comment"># echo &#123;1..9&#125;</span></span><br><span class="line">1 2 3 4 5 6 7 8 9  <span class="comment"># 一次性输出</span></span><br><span class="line">[root@zhuuu mail]<span class="comment"># for i in &#123;1..9&#125;</span></span><br><span class="line">&gt; <span class="keyword">do</span></span><br><span class="line">&gt;   <span class="built_in">echo</span> <span class="variable">$i</span></span><br><span class="line">&gt; <span class="keyword">done</span></span><br><span class="line"><span class="comment"># 一个一个输出</span></span><br><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td></tr></table></figure>

<p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20210123/095731227.png" alt="mark"></p>
<ul>
<li><p>当变量值在列表里，<strong>for循环即执行一次所有命令，使用变量名获取列表中的当前取值。</strong></p>
</li>
<li><p><strong>命令可为任何有效的shell命令和语句。in列表可以包含变量、字符串和文件名，花括号，文本。</strong></p>
</li>
<li><p><strong>将多个相同文件进行批量改名</strong></p>
</li>
</ul>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 1. 取出文件名</span></span><br><span class="line">[root@zhuuu ~]<span class="comment"># touch a.mp3 b.mp3</span></span><br><span class="line">[root@zhuuu ~]<span class="comment"># basename a.mp3 .mp3</span></span><br><span class="line">a</span><br><span class="line"></span><br><span class="line"><span class="comment"># 2. 进行改名</span></span><br><span class="line">[root@zhuuu ~]<span class="comment"># touch a.mp3 b.mp3</span></span><br><span class="line">[root@zhuuu ~]<span class="comment"># basename a.mp3 .mp3</span></span><br><span class="line">a</span><br><span class="line">[root@zhuuu ~]<span class="comment"># for filename in `ls *.mp3`</span></span><br><span class="line">&gt; <span class="keyword">do</span></span><br><span class="line">&gt;    mv <span class="variable">$filename</span> $(basename <span class="variable">$filename</span> .mp3).mp4</span><br><span class="line">&gt; <span class="keyword">done</span></span><br><span class="line">[root@zhuuu ~]<span class="comment"># ls *.mp4</span></span><br><span class="line">a.mp4  b.mp4</span><br></pre></td></tr></table></figure>





<p><strong>注意 ：</strong></p>
<ul>
<li><code>for i in {1..9 }</code> : <strong>逐个操作 i</strong></li>
<li>单纯的 <code>mkdir {1..9} :</code> <strong>批量去操作</strong></li>
</ul>
<h4 id="2-C-语言风格-不常用"><a href="#2-C-语言风格-不常用" class="headerlink" title="2. C 语言风格 (不常用)"></a>2. C 语言风格 (不常用)</h4><p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20210123/100027000.png" alt="mark"></p>
<ul>
<li>简单例子：打印 <code>1-10</code></li>
</ul>
<figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">[root@zhuuu ~]<span class="comment"># for ((i=1;i&lt;=10;i++))</span></span><br><span class="line">&gt; <span class="keyword">do</span> </span><br><span class="line">&gt;   <span class="built_in">echo</span> <span class="variable">$i</span></span><br><span class="line">&gt; <span class="keyword">done</span></span><br><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td></tr></table></figure>



<h4 id="3-while-循环"><a href="#3-while-循环" class="headerlink" title="3. while 循环"></a>3. while 循环</h4><p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20210123/100418596.png" alt="mark"></p>
<ul>
<li>while循环用于不断执行一系列命令，也用于从输入文件中读取数据；</li>
<li>命令通常为测试条件。其格式为： </li>
</ul>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">while</span> condition</span><br><span class="line"><span class="keyword">do</span></span><br><span class="line">    <span class="built_in">command</span></span><br><span class="line"><span class="keyword">done</span></span><br></pre></td></tr></table></figure>



<p><strong>举个例子</strong></p>
<ul>
<li>以下是一个基本的while循环，<strong>测试条件是：如果int小于等于5，那么条件返回真。</strong></li>
<li>int从0开始，<strong>每次循环处理时，int加1</strong>。运行上述脚本，返回数字1到5，然后终止。</li>
</ul>
<figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"> 1 <span class="comment">#!/bin/bash</span></span><br><span class="line"> 2 </span><br><span class="line"> 3 <span class="comment"># while demo </span></span><br><span class="line"> 4 </span><br><span class="line"> 5 int=1</span><br><span class="line"> 6 <span class="keyword">while</span>(( <span class="variable">$int</span> &lt;= 5 ))</span><br><span class="line"> 7 <span class="keyword">do</span></span><br><span class="line"> 8         <span class="built_in">echo</span> <span class="variable">$int</span></span><br><span class="line"> 9         <span class="built_in">let</span> <span class="string">"int++"</span>  <span class="comment">#(( a++ ))</span></span><br><span class="line">10 <span class="keyword">done</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 以上实例使用了 Bash let 命令，它用于执行一个或多个表达式，变量计算中不需要加上 $ 来表示变量</span></span><br></pre></td></tr></table></figure>

<ul>
<li><strong>利用while产生死循环</strong></li>
</ul>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">while</span> :</span><br><span class="line"><span class="keyword">do</span></span><br><span class="line">	cmd1</span><br><span class="line"><span class="keyword">done</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 或者</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">while</span> <span class="literal">true</span></span><br><span class="line"><span class="keyword">do</span></span><br><span class="line">    <span class="built_in">command</span></span><br><span class="line"><span class="keyword">done</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 或者</span></span><br><span class="line"><span class="keyword">for</span> (( ; ; ))</span><br></pre></td></tr></table></figure>



<h4 id="4-until-循环"><a href="#4-until-循环" class="headerlink" title="4. until 循环"></a>4. until 循环</h4><p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20210123/100514018.png" alt="mark"></p>
<ul>
<li><p><strong>和 while 是相反的</strong></p>
<ul>
<li>如果条件为假，循环一直执行</li>
<li>如果条件为真，循环退出</li>
</ul>
</li>
<li><p><strong>until 循环执行一系列命令直至条件为 true 时停止。</strong></p>
</li>
<li><p><strong>一般 while 循环优于 until 循环，但在某些时候—也只是极少数情况下，until 循环更加有用。</strong></p>
</li>
<li><p><strong>until 语法格式:</strong> </p>
<ul>
<li>condition 一般为条件表达式，如果返回值为 false，则继续执行循环体内的语句，否则跳出循环。</li>
</ul>
</li>
</ul>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">until condition</span><br><span class="line"><span class="keyword">do</span></span><br><span class="line">    <span class="built_in">command</span></span><br><span class="line"><span class="keyword">done</span></span><br></pre></td></tr></table></figure>



<ul>
<li><strong>举个例子 : 以下实例我们使用 until 命令来输出 0 ~ 9 的数字</strong></li>
</ul>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line">  1 <span class="comment">#!/bin/bash</span></span><br><span class="line">  2 </span><br><span class="line">  3 <span class="comment">#until demo</span></span><br><span class="line">  4 </span><br><span class="line">  5 a=0</span><br><span class="line">  6 </span><br><span class="line">  7 until [ ! <span class="variable">$a</span> -lt 10 ]</span><br><span class="line">  8 <span class="keyword">do</span></span><br><span class="line">  9         <span class="built_in">echo</span> <span class="variable">$a</span></span><br><span class="line"> 10         a=` expr <span class="variable">$a</span> + 1`  <span class="comment"># (( a++ ))</span></span><br><span class="line"> 11 <span class="keyword">done</span></span><br><span class="line"> </span><br><span class="line"> </span><br><span class="line"> [root@zhuuu ~]<span class="comment"># . 14.sh </span></span><br><span class="line">0</span><br><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td></tr></table></figure>



<h4 id="5-break-continue"><a href="#5-break-continue" class="headerlink" title="5. break / continue"></a>5. break / continue</h4><p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20210123/112600010.png" alt="mark"></p>
<ol>
<li><strong>break</strong></li>
</ol>
<ul>
<li><p><strong>break命令允许跳出所有循环（终止执行后面的所有循环）。</strong></p>
</li>
<li><p><strong>break 作用于：</strong></p>
<ul>
<li>内层循环 ： 内层循环结束</li>
<li>外层循环 :    外层循环结束</li>
</ul>
</li>
<li><p>简单例子 ： 打印终止</p>
</li>
</ul>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">[root@zhuuu ~]<span class="comment"># for num in &#123;1..9&#125;</span></span><br><span class="line">&gt; <span class="keyword">do</span> </span><br><span class="line">&gt;    <span class="keyword">if</span> [ <span class="variable">$num</span> -eq 5 ]; <span class="keyword">then</span></span><br><span class="line">&gt;     <span class="built_in">break</span></span><br><span class="line">&gt;    <span class="keyword">fi</span></span><br><span class="line">&gt;   <span class="built_in">echo</span> <span class="variable">$num</span></span><br><span class="line">&gt; <span class="keyword">done</span></span><br><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td></tr></table></figure>



<ul>
<li>举个例子：</li>
</ul>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line">下面的例子中，脚本进入死循环直至用户输入数字大于5。要跳出这个循环，返回到shell提示符下，需要使用<span class="built_in">break</span>命令。</span><br><span class="line"></span><br><span class="line">实例</span><br><span class="line"><span class="meta">#!/bin/bash</span></span><br><span class="line"><span class="keyword">while</span> :</span><br><span class="line"><span class="keyword">do</span></span><br><span class="line">    <span class="built_in">echo</span> -n <span class="string">"输入 1 到 5 之间的数字:"</span></span><br><span class="line">    <span class="built_in">read</span> aNum</span><br><span class="line">    <span class="keyword">case</span> <span class="variable">$aNum</span> <span class="keyword">in</span></span><br><span class="line">        1|2|3|4|5) <span class="built_in">echo</span> <span class="string">"你输入的数字为 <span class="variable">$aNum</span>!"</span></span><br><span class="line">        ;;</span><br><span class="line">        *) <span class="built_in">echo</span> <span class="string">"你输入的数字不是 1 到 5 之间的! 游戏结束"</span></span><br><span class="line">            <span class="built_in">break</span></span><br><span class="line">        ;;</span><br><span class="line">    <span class="keyword">esac</span></span><br><span class="line"><span class="keyword">done</span></span><br></pre></td></tr></table></figure>



<ol start="2">
<li><strong>continue</strong></li>
</ol>
<ul>
<li><p>continue命令与break命令类似，只有一点差别，它不会跳出所有循环，仅仅跳出当前循环。</p>
</li>
<li><p>简单例子 ： 打印跳过</p>
</li>
</ul>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line">[root@zhuuu ~]</span><br><span class="line"><span class="keyword">for</span> num <span class="keyword">in</span> &#123;1..9&#125;</span><br><span class="line">    <span class="keyword">do</span>     </span><br><span class="line">        <span class="keyword">if</span> [ <span class="variable">$num</span> -eq 5 ] </span><br><span class="line">        <span class="keyword">then</span> <span class="built_in">continue</span>;    </span><br><span class="line">        <span class="keyword">fi</span>;   </span><br><span class="line">    <span class="built_in">echo</span> <span class="variable">$num</span>; </span><br><span class="line"><span class="keyword">done</span></span><br><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td></tr></table></figure>

<ul>
<li>死循环</li>
</ul>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#!/bin/bash</span></span><br><span class="line"><span class="keyword">while</span> :</span><br><span class="line"><span class="keyword">do</span></span><br><span class="line">    <span class="built_in">echo</span> -n <span class="string">"输入 1 到 5 之间的数字: "</span></span><br><span class="line">    <span class="built_in">read</span> aNum</span><br><span class="line">    <span class="keyword">case</span> <span class="variable">$aNum</span> <span class="keyword">in</span></span><br><span class="line">        1|2|3|4|5) <span class="built_in">echo</span> <span class="string">"你输入的数字为 <span class="variable">$aNum</span>!"</span></span><br><span class="line">        ;;</span><br><span class="line">        *) <span class="built_in">echo</span> <span class="string">"你输入的数字不是 1 到 5 之间的!"</span></span><br><span class="line">            <span class="built_in">continue</span></span><br><span class="line">            <span class="built_in">echo</span> <span class="string">"游戏结束"</span></span><br><span class="line">        ;;</span><br><span class="line">    <span class="keyword">esac</span></span><br><span class="line"><span class="keyword">done</span></span><br><span class="line">运行代码发现，当输入大于5的数字时，该例中的循环不会结束，语句 <span class="built_in">echo</span> <span class="string">"游戏结束"</span> 永远不会被执行。</span><br></pre></td></tr></table></figure>



<h4 id="6-使用循环处理命令行参数"><a href="#6-使用循环处理命令行参数" class="headerlink" title="6. 使用循环处理命令行参数"></a>6. 使用循环处理命令行参数</h4><p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20210123/114407760.png" alt="mark"></p>
<p><strong>参数：</strong></p>
<ol>
<li>可以在执行 Shell 脚本时，向脚本传递参数，脚本内获取参数的格式为：<strong>$n</strong>。</li>
<li><strong>n</strong> 代表一个数字，1 为执行脚本的第一个参数，2 为执行脚本的第二个参数，以此类推……</li>
</ol>
<p><strong>例子1 ：</strong> </p>
<ul>
<li>以下实例我们向脚本传递三个参数，并分别输出，其中 <strong>$0</strong> 为执行的文件名（包含文件路径）：</li>
</ul>
<figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#!/bin/bash</span></span><br><span class="line"></span><br><span class="line"><span class="built_in">echo</span> <span class="string">"Shell 传递参数实例！"</span>;</span><br><span class="line"><span class="built_in">echo</span> <span class="string">"执行的文件名：<span class="variable">$0</span>"</span>;</span><br><span class="line"><span class="built_in">echo</span> <span class="string">"第一个参数为：<span class="variable">$1</span>"</span>;</span><br><span class="line"><span class="built_in">echo</span> <span class="string">"第二个参数为：<span class="variable">$2</span>"</span>;</span><br><span class="line"><span class="built_in">echo</span> <span class="string">"第三个参数为：<span class="variable">$3</span>"</span>;</span><br></pre></td></tr></table></figure>

<ul>
<li>结果 : 为脚本设置可执行权限，并执行脚本，输出结果如下所示：</li>
</ul>
<figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">$ chmod +x test.sh </span><br><span class="line">$ ./test.sh 1 2 3</span><br><span class="line">Shell 传递参数实例！</span><br><span class="line">执行的文件名：./test.sh</span><br><span class="line">第一个参数为：1</span><br><span class="line">第二个参数为：2</span><br><span class="line">第三个参数为：3</span><br></pre></td></tr></table></figure>



<hr>
<p><strong>还有几个特殊字符用来处理参数：</strong></p>
<table>
<thead>
<tr>
<th align="left">参数处理</th>
<th align="left">说明</th>
</tr>
</thead>
<tbody><tr>
<td align="left">$#</td>
<td align="left">传递到脚本参数的个数</td>
</tr>
<tr>
<td align="left">$*</td>
<td align="left">以一个单字符串显示所有向脚本传递的参数  注 ： 如”$*”用「”」括起来的情况、以”$1 $2 … $n”的形式输出所有参数。</td>
</tr>
<tr>
<td align="left">$$</td>
<td align="left">脚本当前运行的进程ID</td>
</tr>
<tr>
<td align="left">$!</td>
<td align="left">后台运行的最后一个进程的ID</td>
</tr>
<tr>
<td align="left">$@</td>
<td align="left">与$*相同，但是使用时加引号，并在引号中返回每个参数。<br/>如”$@”用「”」括起来的情况、以”$1” “$2” … “$n” 的形式输出所有参数。</td>
</tr>
<tr>
<td align="left">$-</td>
<td align="left">显示Shell使用的当前选项，与<a href="https://www.runoob.com/linux/linux-comm-set.html" target="_blank" rel="noopener">set命令</a>功能相同。</td>
</tr>
<tr>
<td align="left">$?</td>
<td align="left">显示最后命令的退出状态。0表示没有错误，其他任何值表明有错误。</td>
</tr>
</tbody></table>
<p><strong>注意点 ： $* 与 $@ 区别：</strong></p>
<ul>
<li>相同点：都是引用所有参数。</li>
<li>不同点：只有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3，<ul>
<li>则<code>&quot; * &quot;</code> 等价于 <code>&quot;1 2 3&quot;</code>（传递了一个参数），</li>
<li>而<code>&quot;@&quot;</code>等价于 <code>&quot;1&quot; &quot;2&quot; &quot;3&quot;</code>（传递了三个参数）。</li>
</ul>
</li>
</ul>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#!/bin/bash</span></span><br><span class="line"></span><br><span class="line"><span class="built_in">echo</span> <span class="string">"-- \$* 演示 ---"</span></span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> <span class="string">"$*"</span>; <span class="keyword">do</span></span><br><span class="line">    <span class="built_in">echo</span> <span class="variable">$i</span></span><br><span class="line"><span class="keyword">done</span></span><br><span class="line"></span><br><span class="line"><span class="built_in">echo</span> <span class="string">"-- \$@ 演示 ---"</span></span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> <span class="string">"<span class="variable">$@</span>"</span>; <span class="keyword">do</span></span><br><span class="line">    <span class="built_in">echo</span> <span class="variable">$i</span></span><br><span class="line"><span class="keyword">done</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 执行脚本，输出结果如下所示：</span></span><br><span class="line">$ chmod +x test.sh </span><br><span class="line">$ ./test.sh 1 2 3</span><br><span class="line">-- $* 演示 ---</span><br><span class="line">1 2 3</span><br><span class="line">-- <span class="variable">$@</span> 演示 ---</span><br><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td></tr></table></figure>



<hr>
<p><strong>处理参数样例：</strong></p>
<h5 id="1-for-循环-处理脚本参数"><a href="#1-for-循环-处理脚本参数" class="headerlink" title="1. for 循环 处理脚本参数"></a>1. for 循环 处理脚本参数</h5><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"> 1 <span class="comment">#!/bin/bash</span></span><br><span class="line"> 2 </span><br><span class="line"> 3 <span class="comment">#for demo</span></span><br><span class="line"> 4 </span><br><span class="line"> 5 <span class="keyword">for</span> pos <span class="keyword">in</span> $*</span><br><span class="line"> 6 <span class="keyword">do</span></span><br><span class="line"> 7         <span class="keyword">if</span> [ <span class="string">"<span class="variable">$pos</span>"</span> = <span class="string">"help"</span> ] ;<span class="keyword">then</span></span><br><span class="line"> 8                 <span class="built_in">echo</span> <span class="variable">$pos</span> <span class="variable">$pos</span></span><br><span class="line"> 9 <span class="keyword">fi</span></span><br><span class="line">10 <span class="keyword">done</span></span><br></pre></td></tr></table></figure>



<h5 id="2-while-循环-处理脚本参数"><a href="#2-while-循环-处理脚本参数" class="headerlink" title="2. while 循环 处理脚本参数"></a>2. while 循环 处理脚本参数</h5><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">  1 <span class="comment">#!/bin/bash</span></span><br><span class="line">  2 </span><br><span class="line">  3 <span class="keyword">while</span> [ <span class="variable">$#</span> -ge 1 ]</span><br><span class="line">  4 <span class="keyword">do</span></span><br><span class="line">  5         <span class="keyword">if</span> [ <span class="string">"<span class="variable">$1</span>"</span> = <span class="string">"help"</span> ]</span><br><span class="line">  6         <span class="keyword">then</span> <span class="built_in">echo</span> <span class="variable">$1</span> <span class="variable">$1</span></span><br><span class="line">  7         <span class="keyword">fi</span></span><br><span class="line">  8         <span class="built_in">shift</span></span><br><span class="line">  9 <span class="keyword">done</span>        </span><br><span class="line"></span><br><span class="line"><span class="comment"># shift的作用是参数左移，删除第一个参数，使得后面的参数提前</span></span><br><span class="line">`ls -lrt`  ： 如果多个参数的命令，底层使用的是`<span class="built_in">shift</span>` 平移</span><br></pre></td></tr></table></figure>



<h2 id="10-函数"><a href="#10-函数" class="headerlink" title="10. 函数"></a>10. 函数</h2><p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20210123/165103846.png" alt="mark"></p>
<h3 id="10-1-自定义函数"><a href="#10-1-自定义函数" class="headerlink" title="10.1 自定义函数"></a>10.1 自定义函数</h3><p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20210123/165206328.png" alt="mark"></p>
<ul>
<li><strong>linux shell 可以用户定义函数，然后在shell脚本中可以随便调用。</strong></li>
<li><strong>shell中函数的定义格式如下：</strong></li>
</ul>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">[ <span class="keyword">function</span> ] funname ()</span><br><span class="line"></span><br><span class="line">&#123;</span><br><span class="line"></span><br><span class="line">    action;</span><br><span class="line"></span><br><span class="line">    [<span class="built_in">return</span> int;]</span><br><span class="line"></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>

<p>说明：</p>
<ul>
<li><strong>1、</strong>可以带<code>function fun()</code> <strong>定义</strong>，也可以直接<code>fun()</code>定义,不带任何参数。</li>
<li><strong>2、参数返回</strong>，可以显示加：return 返回，如果不加，将以最后一条命令运行结果，作为返回值。 return后跟数值n(0-255)</li>
</ul>
<hr>
<ul>
<li>简单使用 ： 合并<code>cd</code>和 <code>ls</code>命令</li>
</ul>
<figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">[root@zhuuu ~]<span class="comment"># function cdls()&#123;</span></span><br><span class="line">&gt; <span class="built_in">cd</span> /var</span><br><span class="line">&gt; ls</span><br><span class="line">&gt; &#125;</span><br><span class="line">[root@zhuuu ~]<span class="comment"># cdls</span></span><br><span class="line">adm  cache  crash  db  empty  games  gopher  kerberos  lib  <span class="built_in">local</span>  lock  <span class="built_in">log</span>  mail  nis  opt  preserve  run  spool  tmp  yp</span><br><span class="line"></span><br><span class="line"><span class="comment">#function 可以省略</span></span><br></pre></td></tr></table></figure>

<ul>
<li>return : 下面定义一个带有return语句的函数</li>
</ul>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#!/bin/bash</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="title">funWithReturn</span></span>()&#123;</span><br><span class="line">    <span class="built_in">echo</span> <span class="string">"这个函数会对输入的两个数字进行相加运算..."</span></span><br><span class="line">    <span class="built_in">echo</span> <span class="string">"输入第一个数字: "</span></span><br><span class="line">    <span class="built_in">read</span> aNum</span><br><span class="line">    <span class="built_in">echo</span> <span class="string">"输入第二个数字: "</span></span><br><span class="line">    <span class="built_in">read</span> anotherNum</span><br><span class="line">    <span class="built_in">echo</span> <span class="string">"两个数字分别为 <span class="variable">$aNum</span> 和 <span class="variable">$anotherNum</span> !"</span></span><br><span class="line">    <span class="built_in">return</span> $((<span class="variable">$aNum</span>+<span class="variable">$anotherNum</span>)) <span class="comment"># return $(( aNum + anotherNum ))</span></span><br><span class="line">&#125;</span><br><span class="line">funWithReturn</span><br><span class="line"><span class="built_in">echo</span> <span class="string">"输入的两个数字之和为 $? !"</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">#输出类似下面：</span></span><br><span class="line">这个函数会对输入的两个数字进行相加运算...</span><br><span class="line">输入第一个数字: </span><br><span class="line">1</span><br><span class="line">输入第二个数字: </span><br><span class="line">2</span><br><span class="line">两个数字分别为 1 和 2 !</span><br><span class="line">输入的两个数字之和为 3 !</span><br></pre></td></tr></table></figure>





<h3 id="10-2-自定义函数带参数"><a href="#10-2-自定义函数带参数" class="headerlink" title="10.2 自定义函数带参数"></a>10.2 自定义函数带参数</h3><p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20210123/172934327.png" alt="mark"></p>
<ul>
<li><p><strong>在Shell中，调用函数时可以向其传递参数。</strong></p>
</li>
<li><p><strong>在函数体内部，通过 $n 的形式来获取参数的值，例如，$1表示第一个参数，$2表示第二个参数…</strong></p>
</li>
<li><p><strong>简单例子</strong> : 合并cd 和  ls</p>
</li>
</ul>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">[root@zhuuu var]<span class="comment"># cdls()&#123;</span></span><br><span class="line">&gt; <span class="built_in">cd</span> <span class="variable">$1</span></span><br><span class="line">&gt; ls</span><br><span class="line">&gt; &#125;</span><br><span class="line"></span><br><span class="line">[root@zhuuu var]<span class="comment"># cdls /tmp</span></span><br></pre></td></tr></table></figure>



<h3 id="10-3-局部变量"><a href="#10-3-局部变量" class="headerlink" title="10.3 局部变量"></a>10.3 局部变量</h3><ul>
<li><strong>函数内部的变量使用  ： local</strong>  </li>
<li><strong>作用 ： 防止和函数外部变量重名</strong></li>
<li><strong>举个例子 : 检查后台进程</strong><ul>
<li>有    ：返回0</li>
<li>没有 ：返回1</li>
</ul>
</li>
</ul>
<figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"> 1 <span class="comment">#!/bin/bash</span></span><br><span class="line"> 2 </span><br><span class="line"> 3 <span class="comment">#funtions</span></span><br><span class="line"> 4 </span><br><span class="line"> 5 <span class="function"><span class="title">checkPID</span></span>()&#123;</span><br><span class="line"> 6         <span class="comment"># i 只在本地有效，防止外部i影响函数内部 </span></span><br><span class="line"> 7         <span class="built_in">local</span> i</span><br><span class="line"> 8         <span class="comment"># 遍历所有参数</span></span><br><span class="line"> 9         <span class="keyword">for</span> i <span class="keyword">in</span> $*;</span><br><span class="line">10         <span class="comment"># 检查是否有对应进程号的proc目录</span></span><br><span class="line">11         <span class="keyword">do</span>      </span><br><span class="line">12                 [ -d <span class="string">"proc/<span class="variable">$i</span>"</span> ] &amp;&amp; <span class="built_in">return</span> 0    <span class="comment"># 有返回0</span></span><br><span class="line">13         <span class="keyword">done</span></span><br><span class="line">14         <span class="built_in">return</span> 1        <span class="comment"># 没有返回1</span></span><br><span class="line">15 &#125;</span><br></pre></td></tr></table></figure>



<h3 id="10-4-系统函数库"><a href="#10-4-系统函数库" class="headerlink" title="10.4 系统函数库"></a>10.4 系统函数库</h3><p><img src="http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20210123/192143841.png" alt="mark"></p>
<ol>
<li><strong>查看系统函数库</strong> ： <code>vim /etc/init.d/functions</code></li>
<li><strong>导入函数到当前shell</strong> : <code>source /etc/init.d/functions</code></li>
</ol>
<figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">[root@zhuuu ~]<span class="comment"># vim /etc/init.d/functions </span></span><br><span class="line">[root@zhuuu ~]<span class="comment"># echo_success</span></span><br><span class="line">-bash: echo_success: <span class="built_in">command</span> not found</span><br><span class="line">[root@zhuuu ~]<span class="comment"># source /etc/init.d/functions </span></span><br><span class="line">[root@zhuuu ~]<span class="comment"># echo_success</span></span><br><span class="line">[root@zhuuu ~]<span class="comment">#                                            [  OK  ]</span></span><br></pre></td></tr></table></figure>


      
      <!-- reward -->
      
      <div id="reward-btn">
        打赏
      </div>
      
    </div>
      <!-- copyright -->
      
        <div class="declare">
          <ul class="post-copyright">
            <li>
              <i class="ri-copyright-line"></i>
              <strong>版权声明： </strong s>
              本博客所有文章除特别声明外，均采用 <a href="https://www.apache.org/licenses/LICENSE-2.0.html" rel="external nofollow"
                target="_blank">Apache License 2.0</a> 许可协议。转载请注明出处！
            </li>
          </ul>
        </div>
        
    <footer class="article-footer">
      
          
<div class="share-btn">
      <span class="share-sns share-outer">
        <i class="ri-share-forward-line"></i>
        分享
      </span>
      <div class="share-wrap">
        <i class="arrow"></i>
        <div class="share-icons">
          
          <a class="weibo share-sns" href="javascript:;" data-type="weibo">
            <i class="ri-weibo-fill"></i>
          </a>
          <a class="weixin share-sns wxFab" href="javascript:;" data-type="weixin">
            <i class="ri-wechat-fill"></i>
          </a>
          <a class="qq share-sns" href="javascript:;" data-type="qq">
            <i class="ri-qq-fill"></i>
          </a>
          <a class="douban share-sns" href="javascript:;" data-type="douban">
            <i class="ri-douban-line"></i>
          </a>
          <!-- <a class="qzone share-sns" href="javascript:;" data-type="qzone">
            <i class="icon icon-qzone"></i>
          </a> -->
          
          <a class="facebook share-sns" href="javascript:;" data-type="facebook">
            <i class="ri-facebook-circle-fill"></i>
          </a>
          <a class="twitter share-sns" href="javascript:;" data-type="twitter">
            <i class="ri-twitter-fill"></i>
          </a>
          <a class="google share-sns" href="javascript:;" data-type="google">
            <i class="ri-google-fill"></i>
          </a>
        </div>
      </div>
</div>

<div class="wx-share-modal">
    <a class="modal-close" href="javascript:;"><i class="ri-close-circle-line"></i></a>
    <p>扫一扫，分享到微信</p>
    <div class="wx-qrcode">
      <img src="//api.qrserver.com/v1/create-qr-code/?size=150x150&data=http://zhuuu.work/2020/08/18/Linux/Linux-00-%E5%AE%9E%E6%88%98%E5%AD%A6%E4%B9%A0/" alt="微信分享二维码">
    </div>
</div>

<div id="share-mask"></div>
      
      
  <ul class="article-tag-list" itemprop="keywords"><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/Linux/" rel="tag">Linux</a></li></ul>


    </footer>

  </div>

  
  
  <nav class="article-nav">
    
      <a href="/2020/08/18/Linux/Linux-01-%E7%BD%91%E7%BB%9CIO/" class="article-nav-link">
        <strong class="article-nav-caption">上一篇</strong>
        <div class="article-nav-title">
          
            Linux-01-网络IO
          
        </div>
      </a>
    
    
      <a href="/2020/08/18/Linux/Linux-07-%E5%86%85%E5%AD%98%E7%AE%A1%E7%90%86/" class="article-nav-link">
        <strong class="article-nav-caption">下一篇</strong>
        <div class="article-nav-title">Linux-07-内存管理</div>
      </a>
    
  </nav>


  

  
  
<!-- valine评论 -->
<div id="vcomments-box">
    <div id="vcomments">
    </div>
</div>
<script src="//cdn1.lncld.net/static/js/3.0.4/av-min.js"></script>
<script src='https://cdn.jsdelivr.net/npm/valine@1.3.10/dist/Valine.min.js'></script>
<script>
    new Valine({
        el: '#vcomments',
        notify: false,
        verify: '',
        app_id: '',
        app_key: '',
        path: window.location.pathname,
        avatar: 'mp',
        placeholder: '给我的文章加点评论吧~',
        recordIP: true
    });
    const infoEle = document.querySelector('#vcomments .info');
    if (infoEle && infoEle.childNodes && infoEle.childNodes.length > 0) {
        infoEle.childNodes.forEach(function (item) {
            item.parentNode.removeChild(item);
        });
    }
</script>
<style>
    #vcomments-box {
        padding: 5px 30px;
    }

    @media screen and (max-width: 800px) {
        #vcomments-box {
            padding: 5px 0px;
        }
    }

    #vcomments-box #vcomments {
        background-color: #fff;
    }

    .v .vlist .vcard .vh {
        padding-right: 20px;
    }

    .v .vlist .vcard {
        padding-left: 10px;
    }
</style>

  

  
  
<div class="gitalk" id="gitalk-container"></div>

<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/gitalk@1.5.0/dist/gitalk.css">


<script src="https://cdn.jsdelivr.net/npm/gitalk@1.5.0/dist/gitalk.min.js"></script>


<script src="https://cdn.jsdelivr.net/npm/blueimp-md5@2.10.0/js/md5.min.js"></script>

<script type="text/javascript">
  var gitalk = new Gitalk({
    clientID: 'db188ed8c86dc4b0dbf3',
    clientSecret: 'a58f92160e5a9efd726b7d533000a0737f3e3f3e',
    repo: 'Blog-comments',
    owner: 'Zhuuuuuuuu',
    admin: ['Zhuuuuuuuu'],
    // id: location.pathname,      // Ensure uniqueness and length less than 50
    id: md5(location.pathname),
    distractionFreeMode: false,  // Facebook-like distraction free mode
    pagerDirection: 'last'
  })

  gitalk.render('gitalk-container')
</script>

  

</article>
</section>
      <footer class="footer">
  <div class="outer">
    <ul class="list-inline">
      <li>
        &copy;
        2019-2021
        Zhuuu
      </li>
      <li>
        
      </li>
    </ul>
    <ul class="list-inline">
      <li>
        
        
        <span>
  <i>PV:<span id="busuanzi_value_page_pv"></span></i>
  <i>UV:<span id="busuanzi_value_site_uv"></span></i>
</span>
        
      </li>
      <li>
        <!-- cnzz统计 -->
        
        <script type="text/javascript" src='https://s9.cnzz.com/z_stat.php?id=1278069914&amp;web_id=1278069914'></script>
        
      </li>
    </ul>
  </div>
</footer>
    <div class="to_top">
        <div class="totop" id="totop">
  <i class="ri-arrow-up-line"></i>
</div>
      </div>
    </main>
      <aside class="sidebar">
        <button class="navbar-toggle"></button>
<nav class="navbar">
  
  <div class="logo">
    <a href="/"><img src="/images/ayer-side.svg" alt="朱酱酱的学习博客"></a>
  </div>
  
  <ul class="nav nav-main">
    
    <li class="nav-item">
      <a class="nav-item-link" href="/">主页</a>
    </li>
    
    <li class="nav-item">
      <a class="nav-item-link" href="/tags">标签</a>
    </li>
    
    <li class="nav-item">
      <a class="nav-item-link" href="/tags/JVM/">JVM</a>
    </li>
    
    <li class="nav-item">
      <a class="nav-item-link" href="/tags/JDK%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90/">JDK源码</a>
    </li>
    
    <li class="nav-item">
      <a class="nav-item-link" href="/tags/%E5%A4%9A%E7%BA%BF%E7%A8%8B/">多线程</a>
    </li>
    
    <li class="nav-item">
      <a class="nav-item-link" href="/tags/Mysql/">Mysql</a>
    </li>
    
    <li class="nav-item">
      <a class="nav-item-link" href="/tags/Redis/">Redis</a>
    </li>
    
    <li class="nav-item">
      <a class="nav-item-link" href="/tags/%E8%AE%BE%E8%AE%A1%E8%80%85%E6%A8%A1%E5%BC%8F/">设计模式</a>
    </li>
    
    <li class="nav-item">
      <a class="nav-item-link" href="/tags/MyBatis/">MyBatis</a>
    </li>
    
    <li class="nav-item">
      <a class="nav-item-link" href="/tags/SpringMVC/">SpringMVC</a>
    </li>
    
    <li class="nav-item">
      <a class="nav-item-link" href="/tags/Spring/">Spring</a>
    </li>
    
    <li class="nav-item">
      <a class="nav-item-link" href="/tags/SpringBoot/">SpringBoot</a>
    </li>
    
    <li class="nav-item">
      <a class="nav-item-link" href="/tags/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/">Linux</a>
    </li>
    
    <li class="nav-item">
      <a class="nav-item-link" href="/tags/Leetcode/">Leetcode</a>
    </li>
    
    <li class="nav-item">
      <a class="nav-item-link" href="/tags/%E5%89%8D%E7%AB%AF/">前端</a>
    </li>
    
    <li class="nav-item">
      <a class="nav-item-link" href="/tags/%E7%BD%91%E7%BB%9C%E7%BC%96%E7%A8%8B/">网络编程</a>
    </li>
    
    <li class="nav-item">
      <a class="nav-item-link" href="/tags/photoshop/">photoshop</a>
    </li>
    
    <li class="nav-item">
      <a class="nav-item-link" href="http://smartzhuuu.lofter.com/" target="_blank" rel="noopener">摄影</a>
    </li>
    
    <li class="nav-item">
      <a class="nav-item-link" href="/2020/about">关于我</a>
    </li>
    
  </ul>
</nav>
<nav class="navbar navbar-bottom">
  <ul class="nav">
    <li class="nav-item">
      
      <a class="nav-item-link nav-item-search"  title="Search">
        <i class="ri-search-line"></i>
      </a>
      
      
      <a class="nav-item-link" target="_blank" href="/atom.xml" title="RSS Feed">
        <i class="ri-rss-line"></i>
      </a>
      
    </li>
  </ul>
</nav>
<div class="search-form-wrap">
  <div class="local-search local-search-plugin">
  <input type="search" id="local-search-input" class="local-search-input" placeholder="Search...">
  <div id="local-search-result" class="local-search-result"></div>
</div>
</div>
      </aside>
      <div id="mask"></div>

<!-- #reward -->
<div id="reward">
  <span class="close"><i class="ri-close-line"></i></span>
  <p class="reward-p"><i class="ri-cup-line"></i>请我喝杯咖啡吧~</p>
  <div class="reward-box">
    
    <div class="reward-item">
      <img class="reward-img" src="/images/alipay.jpg">
      <span class="reward-type">支付宝</span>
    </div>
    
    
    <div class="reward-item">
      <img class="reward-img" src="/images/wechat.jpg">
      <span class="reward-type">微信</span>
    </div>
    
  </div>
</div>
      
<script src="/js/jquery-2.0.3.min.js"></script>


<script src="/js/jquery.justifiedGallery.min.js"></script>


<script src="/js/lazyload.min.js"></script>


<script src="/js/busuanzi-2.3.pure.min.js"></script>


<script src="/js/share.js"></script>



<script src="/fancybox/jquery.fancybox.min.js"></script>




<script>
  try {
    var typed = new Typed("#subtitle", {
    strings: ['昨夜西风凋碧树。独上高楼，望尽天涯路','衣带渐宽终不悔，为伊消得人憔悴。','众里寻他千百度。蓦然回首，那人却在，灯火阑珊处。'],
    startDelay: 0,
    typeSpeed: 200,
    loop: true,
    backSpeed: 100,
    showCursor: true
    });
  } catch (err) {
  }
  
</script>




<script src="/js/tocbot.min.js"></script>

<script>
  // Tocbot_v4.7.0  http://tscanlin.github.io/tocbot/
  tocbot.init({
    tocSelector: '.tocbot',
    contentSelector: '.article-entry',
    headingSelector: 'h1, h2, h3, h4, h5, h6',
    hasInnerContainers: true,
    scrollSmooth: true,
    scrollContainer:'main',
    positionFixedSelector: '.tocbot',
    positionFixedClass: 'is-position-fixed',
    fixedSidebarOffset: 'auto',
    onClick: (e) => {
      $('.toc-link').removeClass('is-active-link');
      $(`a[href=${e.target.hash}]`).addClass('is-active-link');
      $(e.target.hash).scrollIntoView();
      return false;
    }
  });
</script>


<script>
  var ayerConfig = {
    mathjax: true
  }
</script>


<script src="/js/ayer.js"></script>


<script src="https://cdn.jsdelivr.net/npm/jquery-modal@0.9.2/jquery.modal.min.js"></script>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/jquery-modal@0.9.2/jquery.modal.min.css">


<!-- Root element of PhotoSwipe. Must have class pswp. -->
<div class="pswp" tabindex="-1" role="dialog" aria-hidden="true">

    <!-- Background of PhotoSwipe. 
         It's a separate element as animating opacity is faster than rgba(). -->
    <div class="pswp__bg"></div>

    <!-- Slides wrapper with overflow:hidden. -->
    <div class="pswp__scroll-wrap">

        <!-- Container that holds slides. 
            PhotoSwipe keeps only 3 of them in the DOM to save memory.
            Don't modify these 3 pswp__item elements, data is added later on. -->
        <div class="pswp__container">
            <div class="pswp__item"></div>
            <div class="pswp__item"></div>
            <div class="pswp__item"></div>
        </div>

        <!-- Default (PhotoSwipeUI_Default) interface on top of sliding area. Can be changed. -->
        <div class="pswp__ui pswp__ui--hidden">

            <div class="pswp__top-bar">

                <!--  Controls are self-explanatory. Order can be changed. -->

                <div class="pswp__counter"></div>

                <button class="pswp__button pswp__button--close" title="Close (Esc)"></button>

                <button class="pswp__button pswp__button--share" style="display:none" title="Share"></button>

                <button class="pswp__button pswp__button--fs" title="Toggle fullscreen"></button>

                <button class="pswp__button pswp__button--zoom" title="Zoom in/out"></button>

                <!-- Preloader demo http://codepen.io/dimsemenov/pen/yyBWoR -->
                <!-- element will get class pswp__preloader--active when preloader is running -->
                <div class="pswp__preloader">
                    <div class="pswp__preloader__icn">
                        <div class="pswp__preloader__cut">
                            <div class="pswp__preloader__donut"></div>
                        </div>
                    </div>
                </div>
            </div>

            <div class="pswp__share-modal pswp__share-modal--hidden pswp__single-tap">
                <div class="pswp__share-tooltip"></div>
            </div>

            <button class="pswp__button pswp__button--arrow--left" title="Previous (arrow left)">
            </button>

            <button class="pswp__button pswp__button--arrow--right" title="Next (arrow right)">
            </button>

            <div class="pswp__caption">
                <div class="pswp__caption__center"></div>
            </div>

        </div>

    </div>

</div>

<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/photoswipe@4.1.3/dist/photoswipe.min.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/photoswipe@4.1.3/dist/default-skin/default-skin.css">
<script src="https://cdn.jsdelivr.net/npm/photoswipe@4.1.3/dist/photoswipe.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/photoswipe@4.1.3/dist/photoswipe-ui-default.min.js"></script>

<script>
    function viewer_init() {
        let pswpElement = document.querySelectorAll('.pswp')[0];
        let $imgArr = document.querySelectorAll(('.article-entry img:not(.reward-img)'))

        $imgArr.forEach(($em, i) => {
            $em.onclick = () => {
                // slider展开状态
                // todo: 这样不好，后面改成状态
                if (document.querySelector('.left-col.show')) return
                let items = []
                $imgArr.forEach(($em2, i2) => {
                    let img = $em2.getAttribute('data-idx', i2)
                    let src = $em2.getAttribute('data-target') || $em2.getAttribute('src')
                    let title = $em2.getAttribute('alt')
                    // 获得原图尺寸
                    const image = new Image()
                    image.src = src
                    items.push({
                        src: src,
                        w: image.width || $em2.width,
                        h: image.height || $em2.height,
                        title: title
                    })
                })
                var gallery = new PhotoSwipe(pswpElement, PhotoSwipeUI_Default, items, {
                    index: parseInt(i)
                });
                gallery.init()
            }
        })
    }
    viewer_init()
</script>



<script type="text/x-mathjax-config">
  MathJax.Hub.Config({
      tex2jax: {
          inlineMath: [ ['$','$'], ["\\(","\\)"]  ],
          processEscapes: true,
          skipTags: ['script', 'noscript', 'style', 'textarea', 'pre', 'code']
      }
  });

  MathJax.Hub.Queue(function() {
      var all = MathJax.Hub.getAllJax(), i;
      for(i=0; i < all.length; i += 1) {
          all[i].SourceElement().parentNode.className += ' has-jax';
      }
  });
</script>

<script src="https://cdn.jsdelivr.net/npm/mathjax@2.7.6/unpacked/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>


<script type="text/javascript" src="https://js.users.51.la/20544303.js"></script>
  </div>
</body>

</html>